GlideDateTime provides robust date and time manipulation in ServiceNow. It handles time zones, date arithmetic, and formatting.
GlideDateTime and GlideDuration are SERVER-SIDE only. They cannot be used in client scripts. For simple date operations, use gs.daysAgo(), gs.now(), etc.
// Create with current date/time
var gdt = new GlideDateTime();
gs.info('Current: ' + gdt.getDisplayValue());
// Create from string (YYYY-MM-DD HH:MM:SS)
var gdt2 = new GlideDateTime('2024-12-25 10:30:00');
gs.info('Christmas: ' + gdt2.getDisplayValue());
// Create from GlideRecord field
var gr = new GlideRecord('incident');
if (gr.get('sys_id_here')) {
var createdDate = gr.sys_created_on.getGlideObject(); // Returns GlideDateTime
gs.info('Created: ' + createdDate.getDisplayValue());
}
// Create from milliseconds
var gdt3 = new GlideDateTime();
gdt3.setNumericValue(1703505600000); // Unix timestamp in ms
var gdt = new GlideDateTime('2024-10-24 15:30:45');
// Get formatted display value
var displayValue = gdt.getDisplayValue(); // '2024-10-24 15:30:45'
var displayValueInternal = gdt.getDisplayValueInternal(); // Without timezone conversion
// Get internal value (database format)
var internalValue = gdt.getValue(); // '2024-10-24 15:30:45'
// Get date only
var date = gdt.getDate(); // Returns GlideDate object
gs.info('Date: ' + date.getValue()); // '2024-10-24'
// Get time only
var time = gdt.getTime(); // Returns GlideTime object
gs.info('Time: ' + time.getValue()); // '15:30:45'
// Get specific components
var year = gdt.getYearLocalTime(); // 2024
var month = gdt.getMonthLocalTime(); // 10
var day = gdt.getDayOfMonthLocalTime(); // 24
var hour = gdt.getHourLocalTime(); // 15
var minute = gdt.getMinuteLocalTime(); // 30
var second = gdt.getSecondLocalTime(); // 45
// Get day of week (1=Monday, 7=Sunday)
var dayOfWeek = gdt.getDayOfWeekLocalTime(); // 4 (Thursday)
// Get numeric value (milliseconds since epoch)
var timestamp = gdt.getNumericValue(); // 1729783845000
var gdt = new GlideDateTime();
// Set from string
gdt.setValue('2024-12-25 10:00:00');
// Set to current date/time
gdt.setNow();
// Set specific components
gdt.setYearLocalTime(2025);
gdt.setMonthLocalTime(1); // January
gdt.setDayOfMonthLocalTime(15);
gdt.setHourLocalTime(14);
gdt.setMinuteLocalTime(30);
gdt.setSecondLocalTime(0);
// Set from numeric value (milliseconds)
gdt.setNumericValue(1703505600000);
// Set to midnight
gdt.setDisplayValue('2024-10-24 00:00:00');
// Example: Set incident due date to 3 days from now at 5 PM
var gr = new GlideRecord('incident');
if (gr.get('sys_id_here')) {
var dueDate = new GlideDateTime();
dueDate.addDaysLocalTime(3);
dueDate.setHourLocalTime(17); // 5 PM
dueDate.setMinuteLocalTime(0);
dueDate.setSecondLocalTime(0);
gr.due_date = dueDate;
gr.update();
}
var gdt = new GlideDateTime();
// Add time
gdt.addYearsLocalTime(1); // Add 1 year
gdt.addMonthsLocalTime(2); // Add 2 months
gdt.addDaysLocalTime(7); // Add 7 days
gdt.addWeeksLocalTime(2); // Add 2 weeks
gdt.addSeconds(3600); // Add 1 hour (3600 seconds)
// Subtract time (use negative numbers)
gdt.addDaysLocalTime(-7); // Subtract 7 days
gdt.addMonthsLocalTime(-1); // Subtract 1 month
// Add milliseconds
gdt.add(86400000); // Add 24 hours (86400000 ms)
// Subtract milliseconds
gdt.subtract(3600000); // Subtract 1 hour (3600000 ms)
// Example: Calculate SLA due date (4 business hours)
var startTime = new GlideDateTime();
var schedule = new GlideSchedule('8-5 weekdays');
var dueTime = schedule.add(startTime, 4 * 60 * 60 * 1000); // 4 hours in ms
gs.info('Due: ' + dueTime.getDisplayValue());
var date1 = new GlideDateTime('2024-10-24 10:00:00');
var date2 = new GlideDateTime('2024-10-25 10:00:00');
// Compare dates
if (date1.before(date2)) {
gs.info('date1 is before date2');
}
if (date2.after(date1)) {
gs.info('date2 is after date1');
}
if (date1.equals(date2)) {
gs.info('dates are equal');
}
// Check if date is on or after another date
if (date1.onOrAfter(date2)) {
gs.info('date1 is on or after date2');
}
// Check if date is on or before another date
if (date1.onOrBefore(date2)) {
gs.info('date1 is on or before date2');
}
// Get difference between dates (returns GlideDuration)
var duration = GlideDateTime.subtract(date1, date2);
gs.info('Difference: ' + duration.getDisplayValue());
// Compare with current time
var now = new GlideDateTime();
var futureDate = new GlideDateTime('2025-12-31 23:59:59');
if (futureDate.after(now)) {
gs.info('Future date is in the future');
}
// Example: Check if incident is overdue
var gr = new GlideRecord('incident');
if (gr.get('sys_id_here')) {
var dueDate = gr.due_date.getGlideObject();
var now = new GlideDateTime();
if (dueDate.before(now)) {
gs.addErrorMessage('Incident ' + gr.number + ' is overdue!');
}
}
GlideDuration represents a length of time and provides methods for duration calculations.
// Create duration from milliseconds
var duration = new GlideDuration(3600000); // 1 hour
gs.info('Duration: ' + duration.getDisplayValue()); // '1:00:00'
// Create duration from string
var duration2 = new GlideDuration();
duration2.setValue('2 12:30:45'); // 2 days, 12 hours, 30 min, 45 sec
// Get duration components
var days = duration2.getDayPart(); // 2
var hours = duration2.getHourPart(); // 12
var minutes = duration2.getMinutePart(); // 30
var seconds = duration2.getSecondPart(); // 45
// Get total values
var totalSeconds = duration2.getRoundedDayPart() * 86400 +
duration2.getHourPart() * 3600 +
duration2.getMinutePart() * 60 +
duration2.getSecondPart();
// Get duration between two dates
var start = new GlideDateTime('2024-10-24 10:00:00');
var end = new GlideDateTime('2024-10-24 14:30:00');
var diff = GlideDateTime.subtract(start, end);
gs.info('Duration: ' + diff.getDisplayValue()); // '4:30:00'
// Get duration in specific units
var durationMs = diff.getNumericValue(); // In milliseconds
// Example: Calculate incident resolution time
var gr = new GlideRecord('incident');
if (gr.get('sys_id_here')) {
if (!gr.resolved_at.nil()) {
var opened = gr.opened_at.getGlideObject();
var resolved = gr.resolved_at.getGlideObject();
var resolutionTime = GlideDateTime.subtract(opened, resolved);
gs.info('Resolution time: ' + resolutionTime.getDisplayValue());
// Store in a duration field
gr.u_resolution_duration = resolutionTime.getDisplayValue();
gr.update();
}
}
var gdt = new GlideDateTime();
// Get timezone
var tz = gdt.getTZ();
gs.info('Timezone: ' + tz);
// Set timezone
gdt.setTZ('America/New_York');
gdt.setTZ('Europe/London');
gdt.setTZ('Asia/Tokyo');
// Get user timezone
var userTZ = gs.getUser().getTimeZone();
gdt.setTZ(userTZ);
// Local time methods (use user's timezone)
var localHour = gdt.getHourLocalTime();
var localDay = gdt.getDayOfMonthLocalTime();
// UTC methods (ignore timezone)
var utcHour = gdt.getHourUTC();
var utcDay = gdt.getDayOfMonthUTC();
// Example: Log date in different timezones
var gdt = new GlideDateTime();
gs.info('UTC: ' + gdt.getDisplayValueInternal());
gdt.setTZ('America/Los_Angeles');
gs.info('PST: ' + gdt.getDisplayValue());
gdt.setTZ('Europe/Paris');
gs.info('CET: ' + gdt.getDisplayValue());
// Pattern 1: Set due date to end of business day
var dueDate = new GlideDateTime();
dueDate.addDaysLocalTime(3);
dueDate.setHourLocalTime(17); // 5 PM
dueDate.setMinuteLocalTime(0);
dueDate.setSecondLocalTime(0);
// Pattern 2: Check if date is today
function isToday(gdtDate) {
var today = new GlideDateTime();
return gdtDate.getYearLocalTime() == today.getYearLocalTime() &&
gdtDate.getMonthLocalTime() == today.getMonthLocalTime() &&
gdtDate.getDayOfMonthLocalTime() == today.getDayOfMonthLocalTime();
}
// Pattern 3: Get start of day
function getStartOfDay(gdt) {
var startOfDay = new GlideDateTime(gdt.getValue());
startOfDay.setHourLocalTime(0);
startOfDay.setMinuteLocalTime(0);
startOfDay.setSecondLocalTime(0);
return startOfDay;
}
// Pattern 4: Get end of day
function getEndOfDay(gdt) {
var endOfDay = new GlideDateTime(gdt.getValue());
endOfDay.setHourLocalTime(23);
endOfDay.setMinuteLocalTime(59);
endOfDay.setSecondLocalTime(59);
return endOfDay;
}
// Pattern 5: Calculate age of record
var gr = new GlideRecord('incident');
if (gr.get('sys_id_here')) {
var created = gr.sys_created_on.getGlideObject();
var now = new GlideDateTime();
var age = GlideDateTime.subtract(created, now);
var days = age.getDayPart();
var hours = age.getHourPart();
gs.info('Incident age: ' + days + ' days, ' + hours + ' hours');
}
// Pattern 6: Query records from specific date range
var gr = new GlideRecord('incident');
var startDate = new GlideDateTime('2024-10-01 00:00:00');
var endDate = new GlideDateTime('2024-10-31 23:59:59');
gr.addQuery('sys_created_on', '>=', startDate);
gr.addQuery('sys_created_on', '<=', endDate);
gr.query();
gs.info('October incidents: ' + gr.getRowCount());
new GlideDateTime() - Current timegetGlideObject() - From GlideRecordaddDaysLocalTime(n) - Add daysbefore()/after() - ComparegetDisplayValue() - Format outputGlideDateTime.subtract() - DurationsetHourLocalTime() - Set time