- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
3 weeks ago
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.
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)
Solved! Go to Solution.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
3 weeks ago
this works in scoped app
var strConvertedDateTime = new GlideScheduleDateTime(new GlideDateTime()).convertTimeZone("UTC", "IST");
var gdtConvertedDateTime = new GlideDateTime(strConvertedDateTime)
gs.info("Converted Time: "+gdtConvertedDateTime);
💡 If my response helped, please mark it as correct ✅ and close the thread 🔒— this helps future readers find the solution faster! 🙏
Ankur
✨ Certified Technical Architect || ✨ 10x ServiceNow MVP || ✨ ServiceNow Community Leader
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
3 weeks ago
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
3 weeks ago
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
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
// 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);
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
3 weeks ago
Hi Pavan,
Getting the below error :.
Cannot find function convertTimeZone in object
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
3 weeks ago
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
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
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
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.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
3 weeks ago
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.
