What is GlideDateTime?

GlideDateTime provides robust date and time manipulation in ServiceNow. It handles time zones, date arithmetic, and formatting.

Server-Side Only

GlideDateTime and GlideDuration are SERVER-SIDE only. They cannot be used in client scripts. For simple date operations, use gs.daysAgo(), gs.now(), etc.

Creating GlideDateTime Objects

Initialization Methods
// 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

Getting Values

Retrieving Date/Time Information
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

Setting Values

Modifying Date/Time
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();
}

Date Arithmetic

Adding and Subtracting Time
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());

Comparing Dates

Date Comparison Methods
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

GlideDuration represents a length of time and provides methods for duration calculations.

Working with Durations
// 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();
    }
}

Timezone Handling

Working with Timezones
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());

Common Patterns

Practical Examples
// 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());

CSA & CAD Exam Questions (12 Questions)

Where can you use GlideDateTime? Q1
CSA
  • A) Client scripts only
  • B) Server-side scripts only
  • C) Both client and server scripts
  • D) Only in scheduled jobs
Show Answer
Correct Answer: B
GlideDateTime is server-side only. It cannot be used in client scripts. For client-side date operations, use JavaScript Date objects or pass data from server.
How do you create a GlideDateTime object with the current date/time? Q2
CSA
  • A) var gdt = GlideDateTime.now()
  • B) var gdt = new GlideDateTime()
  • C) var gdt = new GlideDateTime(gs.now())
  • D) var gdt = GlideDateTime.current()
Show Answer
Correct Answer: B
new GlideDateTime() creates a GlideDateTime object initialized to the current date and time. You can also use setNow() method.
How do you add 7 days to a GlideDateTime object? Q3
CSA
  • A) gdt.addDays(7)
  • B) gdt.addDaysLocalTime(7)
  • C) gdt.add(7)
  • D) gdt.plusDays(7)
Show Answer
Correct Answer: B
Use addDaysLocalTime(7) to add days using local time. Use negative numbers to subtract: addDaysLocalTime(-7) subtracts 7 days.
How do you get a GlideDateTime object from a GlideRecord date field? Q4
CSA
  • A) gr.field.getDateTime()
  • B) gr.field.getGlideObject()
  • C) new GlideDateTime(gr.field)
  • D) gr.field.toGlideDateTime()
Show Answer
Correct Answer: B
Use getGlideObject() to get a GlideDateTime object from a GlideRecord date/time field. Example: var gdt = gr.sys_created_on.getGlideObject();
How do you compare if one date is before another? Q5
CSA
  • A) date1 < date2
  • B) date1.before(date2)
  • C) date1.isBefore(date2)
  • D) date1.compare(date2) < 0
Show Answer
Correct Answer: B
Use the before() method: if (date1.before(date2)) { }. Also available: after(), equals(), onOrBefore(), onOrAfter().
What does getDisplayValue() return for a GlideDateTime? Q6
CAD
  • A) Unix timestamp
  • B) Formatted date/time string for display
  • C) JavaScript Date object
  • D) Number of days since epoch
Show Answer
Correct Answer: B
getDisplayValue() returns a formatted string representation of the date/time (e.g., '2024-10-24 15:30:45'). Use getValue() for internal format.
How do you calculate the duration between two GlideDateTime objects? Q7
CAD
  • A) date1.subtract(date2)
  • B) GlideDateTime.subtract(date1, date2)
  • C) date1.getDuration(date2)
  • D) new GlideDuration(date1, date2)
Show Answer
Correct Answer: B
Use the static method GlideDateTime.subtract(start, end) which returns a GlideDuration object representing the time difference.
What does GlideDuration represent? Q8
CAD
  • A) A specific date and time
  • B) A length of time
  • C) A timezone offset
  • D) A date format
Show Answer
Correct Answer: B
GlideDuration represents a length/span of time (e.g., 3 days, 2 hours, 30 minutes). It's the difference between two dates.
How do you set a GlideDateTime to midnight (00:00:00)? Q9
CAD
  • A) gdt.setToMidnight()
  • B) gdt.setHourLocalTime(0); gdt.setMinuteLocalTime(0); gdt.setSecondLocalTime(0)
  • C) gdt.clearTime()
  • D) gdt.setTime('00:00:00')
Show Answer
Correct Answer: B
Set each time component to 0: gdt.setHourLocalTime(0); gdt.setMinuteLocalTime(0); gdt.setSecondLocalTime(0); to set time to midnight.
What method returns the year from a GlideDateTime? Q10
CSA
  • A) gdt.getYear()
  • B) gdt.getYearLocalTime()
  • C) gdt.year()
  • D) gdt.getYearValue()
Show Answer
Correct Answer: B
Use getYearLocalTime() to get the year. Similar methods: getMonthLocalTime(), getDayOfMonthLocalTime(), getHourLocalTime(), etc.
How do you subtract 3 months from a GlideDateTime? Q11
CAD
  • A) gdt.subtractMonths(3)
  • B) gdt.addMonthsLocalTime(-3)
  • C) gdt.minusMonths(3)
  • D) gdt.subtract(3, 'months')
Show Answer
Correct Answer: B
Use negative numbers with add methods to subtract: addMonthsLocalTime(-3) subtracts 3 months. Same pattern for days, years, weeks.
Can you modify a GlideDateTime object retrieved from a GlideRecord field without affecting the record? Q12
CAD
  • A) No, changes affect the record automatically
  • B) Yes, it's a copy - assign it back to save changes
  • C) Only if you call gdt.detach()
  • D) Only in before business rules
Show Answer
Correct Answer: B
getGlideObject() returns a copy. Modifications don't affect the record unless you assign it back: gr.field = modifiedGdt; gr.update();

Quick Reference

  • new GlideDateTime() - Current time
  • getGlideObject() - From GlideRecord
  • addDaysLocalTime(n) - Add days
  • before()/after() - Compare
  • getDisplayValue() - Format output
  • GlideDateTime.subtract() - Duration
  • setHourLocalTime() - Set time
  • Server-side only!