Date/time input setup for different action item types

  • Release version: Zurich
  • Updated July 31, 2025
  • 3 minutes to read
  • Summarize
    Summarized using AI
    This content was generated using new OpenAI-powered functionality. Results are provided on an as is basis and are not guaranteed to be accurate or complete.

    Summary of Date/time input setup for different action item types

    This guide explains how to configure date/time inputs for different types of action items within ServiceNow, specifically after creating an input form screen with theIncludeTimezoneattribute enabled. Proper setup ensures accurate handling of date/time values with respect to time zones and back-end data storage. The setup varies depending on whether the action item is of typeNew or UpdateorScript.

    Show full answer Show less

    Key Setup Details by Action Item Type

    • New or Update: Map date/time inputs directly to date/time fields in the back-end instance. The system uses the device’s time zone info from the input form and converts the date/time values to Coordinated Universal Time (UTC) before saving to the database.
    • Script: You must manually convert the date/time input values to UTC/GMT using scripting. Customizations may be required based on specific use cases.

    Script Examples and Practical Application

    The documentation provides script examples demonstrating how to handle date/time inputs in scripting for two common data types:

    • GlideDateTime: For fields storing Date Time columns, initialize a GlideDateTime object by passing the input date/time string (formatted as YYYY-MM-DDThh:mm:ss.sssTZD when IncludeTimezone is true). You can then assign this object directly to the record fields using GlideRecord.setValue(). The example also includes validation to ensure the start date precedes the end date and logic to detect scheduling conflicts.
    • GlideScheduleDateTime: For schedule entry fields which are not traditional Date Time columns but Schedule Date/Time columns, set values by assigning the internal display value of a GlideDateTime object (using getDisplayValueInternal()). This method returns the date/time in the user profile’s time zone in the internal format YYYY-MM-DD hh:mm:ss. The example covers creating a schedule entry with support for recurring events.

    Why This Matters for ServiceNow Customers

    Correctly configuring date/time inputs and handling time zones ensures that scheduled tasks, events, and related action items reflect accurate timing across different user time zones. This is critical for global operations and for maintaining data integrity in scheduling and task management.

    What to Expect

    • Accurate conversion and storage of date/time values in UTC in the database.
    • Capability to script complex date/time logic including validation and conflict detection.
    • Support for both standard date/time fields and schedule-specific date/time fields.
    • Improved reliability when working with distributed teams and devices in multiple time zones.

    After you create an input form screen and define its IncludeTimezone attribute for date/time inputs, you must associate the input form screen with an action item. How you set up the date/time inputs depends on the type of action item you use.

    Action item type Set up
    New or Update Make sure that date/time inputs are mapped to date/time fields in the back-end instance. The back-end instance uses the Device Time Zone information sent by the input form screen. Then the back-end instance converts the date/time value to Coordinated Universal Time (UTC/GMT) before saving it to the database.
    Script You must convert the date/time input value to UTC/GMT. Refer to the following script examples for more information. For more information about scripting in general for ServiceNow, see Scripting
    Note:
    Customizations might be needed depending on the use case involved.

    GlideDateTime script example

    The following example sets fields of the GlideDateTime type.

    /sys_sg_write_back_action_step.do?sys_id=b390e6a7c1120110fa9b5abd6a7dbb64
    (function WriteBackAction(parm_input, parm_variable, actionResult) {
    	var shortDescription = parm_input.shortdescription;
    	var scheduledStart = parm_input.expectedstart;
    	var estimatedEnd = parm_input.estimatedend;
    	var description = parm_input.description;
    	var wotSysId = parm_variable['sys_id'];
    	
    	var wotGr = new GlideRecord("wm_task");
    	wotGr.get(wotSysId);
    	wotGr.setValue("description", description);
    	wotGr.setValue("short_description", shortDescription);
    	
    	var newEnd = new GlideDateTime(estimatedEnd);
    	var endMS = newEnd.getNumericValue();
    	
    	var newStart = new GlideDateTime(scheduledStart);
    	var startMS = newStart.getNumericValue();
    	
    	if (endMS - startMS < 0) {
    		gs.addErrorMessage(gs.getMessage("The start date should come before the end date"));
    	} else {
    		//set the time on screen all the time
    		wotGr.setValue("expected_start", newStart);
    		wotGr.setValue("estimated_end", newEnd);
    		var duration = endMS - startMS;
    		var newDur = new GlideDuration();
    		newDur.setValue(duration);
    		wotGr.setValue("estimated_work_duration", newDur);
    		
    		//check double booking no matter which field is changed. set needs_attention so that dispatcher can review it.
    		var info = new global.FSMAgentInfo(gs.getUserID());
    		var doubleBooking = info.allowAgentDoubleBookingTask();
    		if (doubleBooking){
    			var conflict = !(new global.SMDDateValidation().checkSchedulingConflictSimple(wotGr));
    			if (conflict) {
    				//BR Date Checks will display conflict message as Warning: {0} has been scheduled for a time the assigned
    				//only when time change.
    				wot.Gr.setValue("needs_attention", true);
    			}
    		}
    • In this example, the expected_start and estimated_end fields are edited based on the values of their corresponding date/time inputs of expectedstart and estimatedend.
    • Because the IncludeTimezone attribute is set to true, the parm_input.expectedstart variable returns a date/time string in the format YYYY-MM-DDThh:mm:ss.sssTZD. To enable the system to handle this date/time format, initialize a GlideDateTime object by passing the string into the constructor.
    • Because expected_start and estimated_end are Date Time columns in the database, you can directly call GlideRecord.setValue() and pass the GlideDateTime object as the value.

    GlideScheduleDateTime script example

    The following example sets fields of the GlideScheduleDateTime type.

    /sys_sg_write_back_action_item.do?sys_id=539b20d6b72120107be0e34e9e11a971
    (function WriteBackAction(parm_input,parm_variable,actionResult) {
    
    	var personalSchedule = new global.FSMMobileUtil().getUserSchedule(parm_variable.user);
    	if (gs.nil(personalSchedule)) {
    		gs.error("create_event: personal schedule id is not found.");
    		gs.addErrorMessage(gs.getMessage("Create Event Failed"));
    		return;
    	}
    	
    	if(gs.nil(parm_input.type))
    		parm_input.type = "";
    	
    	var scheduleEntryGR = new GlideRecord("cmn_schedule_span");
    	scheduleEntryGR.initialize();
    	scheduleEntryGR.setValue("name", parm_input.name);
    	
    	var start_time = new GlideDateTime(parm_input.start_time);
    	scheduleEntryGR.start_date_time = start_time.getDisplayValueInternal();
    	
    	var end_time = new GlideDateTime(parm_input.end_time);
    	scheduleEntryGR.end_date_time = end_time.getDisplayValueInternal();
    	
    	scheduleEntryGR.setValue("show_as", parm_input.show_as);
    	scheduleEntryGR.setValue("type", parm_input.type);
    	scheduleEntryGR.setValue("user", parm_variable.user);
    	scheduleEntryGR.setValue("schedule", personalSchedule);
    	scheduleEntryGR.setValue("repeat_type", parm_input.repeats);
    	if(parm_input.repeats!=""){
    		scheduleEntryGR.setValue("repeat_count", parm_input.repeat_every);
    		scheduleEntryGR.repeat_until = parm_input.repeat_until;
    	}
    	scheduleEntryGR.insert();
    	
    	
    })(parm_input,parm_variable,actionResult);
    • In this example, the start_date_time and end_date_time fields of a schedule entry are set based on the values of their corresponding date/time inputs of start_time and end_time.
    • Because the IncludeTimezone attribute is set to true, the parm_input.start_time variable returns a date/time string in the format YYYY-MM-DDThh:mm:ss.sssTZD. To enable the system to handle this date/time format, initialize a GlideDateTime object by passing the string into the constructor.
    • Because start_date_time and end_date_time are not Date Time Columns in the database (instead, they are Schedule Date/Time columns), their value are set with gr.start_date_time = {date_time_value}.
      Note:
      The date_time_value is expected to be in the User Profile Time Zone (the value provided is expected to be the Display Value of a GlideDateTime). This configuration makes it possible to call the GlideDateTime.getDisplayValueInternal() method, which returns a date/time string in the internal format of YYYY-MM-DD hh:mm:ss and in the User Profile Time Zone.