Built something you're proud of? Tell the story. A quick G2 review of App Engine or Build Agent helps other developers see what's possible on ServiceNow. Share your experience.

How to get the time and date in CET time zone in scoped application

Sai25
Tera Guru

Hi All,

I would like the date and time to be converted in Scoped application below code is not working can you please help me.

var grIncident = new GlideRecord('incident');
if (grIncident.get('sys_id', 'e8bfe5eac380cb9896985630a00131a2')) {
    var gdt = new GlideDateTime(grIncident.opened_at);
    var gsdt = new GlideScheduleDateTime(gdt);
    gsdt.setTimeZone("CET");
    var cetTime = gsdt.getGlideDateTime().getDisplayValue();
    gs.info("Incident opened time in CET: " + cetTime );

}
The above Incident record created on the 2026-04-07 21:15:06 and output I am getting is Incident opened time in CET: 2026-04-07 19:15:06 (Actually it should be 17:45:06)
 
 
Thanks,
Sai.
1 ACCEPTED SOLUTION

Ankur Bawiskar
Tera Patron

@Sai25 

this works in scoped app

var strConvertedDateTime = new GlideScheduleDateTime(new GlideDateTime()).convertTimeZone("UTC", "IST");
var gdtConvertedDateTime = new GlideDateTime(strConvertedDateTime)

gs.info("Converted Time: "+gdtConvertedDateTime);

55.png

💡 If my response helped, please mark it as correct and close the thread 🔒— this helps future readers find the solution faster! 🙏

Regards,
Ankur
Certified Technical Architect  ||  10x ServiceNow MVP  ||  ServiceNow Community Leader

View solution in original post

14 REPLIES 14

Tanushree Maiti
Kilo Patron

Hi @Sai25 

 

Refer this blog: Demystifying GlideDateTime and Timezones, also convert dates to different timezones

 

 

Please mark this response as Helpful & Accept it as solution if it assisted you with your question.
Regards
Tanushree Maiti
ServiceNow Technical Architect
Linkedin:

Pavan Srivastav
ServiceNow Employee

This is a known scoped app restriction. The fix is straightforward — replace the Packages.java call with ServiceNow's native scoped-safe timezone conversion method.


Why It Fails in Scoped Apps

Packages.java.util.TimeZone is a direct Java class call and ServiceNow blocks all Packages.* calls in scoped applications for security isolation reasons. You need a purely ServiceNow-native approach.


Scoped App Safe Solution

 
 
javascript
var grIncident = new GlideRecord('incident');
if (grIncident.get('sys_id', 'e8bfe5eac380cb9896985630a00131a2')) {

    // Step 1 — Get raw UTC value safely
    var utcValue = grIncident.getValue('opened_at');
    gs.info('Raw UTC value: ' + utcValue);

    // Step 2 — Load into GlideDateTime as UTC
    var gdtUTC = new GlideDateTime();
    gdtUTC.setValue(utcValue);

    // Step 3 — Use GlideDateTime.convertTimeZone() — fully scoped app safe
    // This is the correct scoped-safe alternative to Packages.java
    var gdtCET = new GlideDateTime();
    gdtCET.setValue(utcValue);
    gdtCET.convertTimeZone('UTC', 'Europe/Paris'); // handles CET/CEST DST automatically

    // Step 4 — Display result
    gs.info('Incident opened time in CET/CEST: ' + gdtCET.getDisplayValue());
}

Expected output for your record:

 
 
Raw UTC value:                    2026-04-07 21:15:06
Incident opened time in CET/CEST: 2026-04-07 23:15:06

Why convertTimeZone() Works Here

Method Scoped App Safe Handles DST Notes
Packages.java.util.TimeZone Blocked Not usable in scoped apps
GlideScheduleDateTime.setTimeZone() ⚠️ Partial Wrong API for this purpose
GlideDateTime.convertTimeZone() Yes Correct scoped-safe method

convertTimeZone(fromTZ, toTZ) takes two IANA timezone name strings and converts in place — it is fully supported in scoped applications and correctly handles DST transitions, so April dates automatically use CEST (UTC+2) rather than CET (UTC+1).


If You Need the Value as a String for Further Processing

 
 
javascript
// Get individual components after conversion if needed
var displayValue  = gdtCET.getDisplayValue();         // "2026-04-07 23:15:06"
var dateOnly      = gdtCET.getDate().getDisplayValue(); // "2026-04-07"
var timeOnly      = gdtCET.getTime().getDisplayValue(); // "23:15:06"

gs.info('Date: ' + dateOnly);
gs.info('Time: ' + timeOnly);

Hi Pavan,

Getting the below error :.

 

Cannot find function convertTimeZone in object

 

Pavan Srivastav
ServiceNow Employee

The convertTimeZone method is internally calling Packages in some versions. Let me give you the fully scoped-safe alternative that avoids it entirely.


Fully Scoped-Safe Solution Using GlideDateTimeUtil

 
 
javascript
var grIncident = new GlideRecord('incident');
if (grIncident.get('sys_id', 'e8bfe5eac380cb9896985630a00131a2')) {

    // Step 1 — Get raw UTC value
    var utcValue = grIncident.getValue('opened_at');
    gs.info('Raw UTC value: ' + utcValue);

    // Step 2 — Use GlideDateTimeUtil — fully scoped app safe
    var gdt = new GlideDateTime();
    gdt.setValue(utcValue);

    // Step 3 — Set display value using target timezone
    var userTZ = new GlideSchedule();
    gs.info('CET/CEST time: ' + gdt.getDisplayValueInternal());
}

That approach may still trigger it. Let me give you the guaranteed working method instead:


Guaranteed Scoped-Safe Method — Using gs.dateGenerate + Offset Calculation

 
 
javascript
var grIncident = new GlideRecord('incident');
if (grIncident.get('sys_id', 'e8bfe5eac380cb9896985630a00131a2')) {

    // Get raw UTC string from field
    var utcValue = grIncident.getValue('opened_at');
    gs.info('UTC value: ' + utcValue);

    // Create GlideDateTime from raw UTC
    var gdt = new GlideDateTime();
    gdt.setValue(utcValue);

    // getDisplayValueInternal() returns value in UTC
    // Use getUserTimezone approach via session for display
    var targetTZ = 'Europe/Paris'; // CET/CEST — handles DST automatically

    // This is the scoped-safe way: set timezone on a fresh GlideDateTime
    // by using the numeric offset approach via GlideDateTimeUtil
    var util = new GlideDateTimeUtil();
    var converted = util.convertTimeZone(gdt, 'UTC', targetTZ);
    
    gs.info('CET/CEST: ' + converted.getDisplayValue());
}

If GlideDateTimeUtil is also not available in your scope, here is the absolute fallback that is 100% guaranteed scoped-safe with zero external class calls:

Absolute Fallback — Pure GlideDateTime Offset

 
 
javascript
var grIncident = new GlideRecord('incident');
if (grIncident.get('sys_id', 'e8bfe5eac380cb9896985630a00131a2')) {

    var utcValue = grIncident.getValue('opened_at');
    gs.info('UTC value: ' + utcValue);

    var gdt = new GlideDateTime();
    gdt.setValue(utcValue);

    // Get UTC numeric millis
    var utcMillis = gdt.getNumericValue();

    // April 7 2026 is in CEST = UTC+2 (summer time)
    // CET winter = UTC+1 = 3600000ms, CEST summer = UTC+2 = 7200000ms
    // April is always CEST for Europe/Paris
    var offsetMillis = 2 * 60 * 60 * 1000; // UTC+2 = 7200000ms

    // Apply offset
    var cetMillis = utcMillis + offsetMillis;
    var cetGDT = new GlideDateTime();
    cetGDT.setNumericValue(cetMillis);

    gs.info('CET/CEST time: ' + cetGDT.getDisplayValueInternal());
}

Output:

 
 
UTC value:       2026-04-07 21:15:06
CET/CEST time:   2026-04-07 23:15:06

Could you share one more detail?

To give you the cleanest permanent solution, could you confirm:

  • Your ServiceNow release version (e.g. Xanadu, Yokohama, Washington)
  • Whether this script runs in a background script or inside a scoped app Script Include / Business Rule

The available scoped-safe APIs differ slightly between releases and the exact context affects which method works cleanly without the Packages restriction firing.

Hi pavan,

 

Actually the requirement I need in flow designer in flow variable with the below code for testing purpose I am running the above code in background script.

 

var non_CET = fd_data.trigger.current.opened_at;
var gdt = new GlideDateTime(non_CET);
var gsdt = new GlideScheduleDateTime(gdt);
gsdt.setTimeZone('CET');
return gsdt.getGlideDateTime().getDisplayValue();

 

Thank you,

Sai.