Find your people. Pick a challenge. Ship something real. The CreatorCon Hackathon is coming to the Community Pavilion for one epic night. Every skill level, every role welcome. Join us on May 5th and learn more here.

Date Conversion Problems

John Prouty
Kilo Guru

I have a Flow Designer action:

find_real_file.png

My problem is that for some reason, the format of the two input variables (start_date and end_date) are not the same format.  I need someway to convert the dates into a consistent format so that the duration calculation will work properly.

Here is the input and output of the action:

find_real_file.png

the two dates: 12-7-2020 11:33:55 and 12-902020 17:44:53 are 2 days, 6 hrs, 10 min, 58 secs, NOT 11,324 days, 22 hrs, 10 min, 58 secs.

I should probably has logic in my action to detect which format each input variable is in, but I don't know how to do that.

1 ACCEPTED SOLUTION

John Prouty
Kilo Guru

I could only test the script in Flow Designer.  dateDiff doesn't work in FlowDesigner.  I replaced it with Subtract.

Here is the final/working code:

(function execute(inputs, outputs) {

     var starting_date = new GlideDateTime(inputs.start_date);
     var ending_date = new GlideDateTime(inputs.end_date);
     var time_zone_adj = new GlideTime();
     time_zone_adj.setValue("08:00:00");
     starting_date.add(time_zone_adj);
     ending_date.add(time_zone_adj);

     var schedule = new GlideSchedule(inputs.schedule_sys_id);
     var duration = schedule.duration(starting_date, ending_date);
     //outputs.message = "Schedule Duration: " + duration.getDurationValue();

     outputs.starting_date = starting_date;
     outputs.ending_date = ending_date;
     outputs.duration = duration;

})(inputs, outputs);

One thing I figured out is that my dates were Local Timezone and GlideDateTime assumes they are UTC.  So I had to add 8 hours to the start and end dates.

I also dropped the getDurationValue from the assignment of outputs.duration.

ServiceNow is good at converting dates of various formats to a standard time.

View solution in original post

9 REPLIES 9

John Prouty
Kilo Guru

your code is equivalent to mine.  I tried it anyway and I get the same results.  Got any other ideas?

I think the format of system date/time looks to be different than the conversion that you are doing. 

your system date/time format is yyyy-mm-dd where as the values you got are in dd-mm-yyyy. Check if that is causing any issue.

John Prouty
Kilo Guru

I have done enough testing to determine that my problem is not a data format issue.  GlideDateTime seems to be smart enough to handle dates of a variety of formats.  I get the same results whether I use YYYY-MM-DD format of MM-DD-YYYY format.  My problem is that two dates that are 2 days apart are generating a duration of 11,354 days!  If I use a different schedule I do get a different duration, but it is 11,324 days (both are unreasonable).  I have tried base calendars (that came with the developer instance), so they are calendars deployed by ServiceNow.

Here is my Action:

(function execute(inputs, outputs) {

   var schedule = new GlideSchedule();
  schedule.load(inputs.schedule_sys_id);

  var starting_date = new GlideDateTime(inputs.start_date);
  var ending_date = new GlideDateTime(inputs.end_date);

  outputs.starting_date = starting_date;
  outputs.ending_date = ending_date;
  var duration = schedule.duration(outputs.starting_date, outputs.ending_date);
  outputs.duration = duration.getDurationValue();


   //outputs.message = "Starting Date: Yr-" + starting_date.getYearLocalTime() + ", Mth-" +     starting_date.getMonthLocalTime() + ", Day-" + starting_date.getDayOfMonthLocalTime() +
    "; Ending Date: Yr-" + ending_date.getYearLocalTime() + ", Mth-" + ending_date.getMonthLocalTime() +     ", Day-" + ending_date.getDayOfMonthLocalTime() + ".";

})(inputs, outputs);

The message output was for testing purposes only (to see the internal values of dates).

Any ideas of why 11-02-2020 08:00:00  and 11-04-2020 09:00:00 generates such a large duration (11,324 days)?

Hi,

I just did 1 quick test on background script using

var gdt = new GlideDateTime("01-01-1970 08:00:00");
var gdt1 = new GlideDateTime("11-04-2020 09:00:00");
gs.print(gs.dateDiff(gdt,gdt1,false));
var schedule = new GlideSchedule('090eecae0a0a0b260077e1dfa71da828');  (schedule excluding weekends)
var duration = schedule.duration(gdt,gdt1);
gs.print(duration.getDurationValue());

and the result is 

*** Script: 18570 01:00:00 (without any scheudle)
*** Script: 13081 15:00:00 (with schedule)

So if you notice I have taken start date/time as 1970/01/01 which is the default start date/time SN considers when the format is not correct.

Looking at this i still feel that somewhere there is issue with the format of date/time. 

Can you run this script in your background using yoru schedule id and those 2 dates and check once.

John Prouty
Kilo Guru

I could only test the script in Flow Designer.  dateDiff doesn't work in FlowDesigner.  I replaced it with Subtract.

Here is the final/working code:

(function execute(inputs, outputs) {

     var starting_date = new GlideDateTime(inputs.start_date);
     var ending_date = new GlideDateTime(inputs.end_date);
     var time_zone_adj = new GlideTime();
     time_zone_adj.setValue("08:00:00");
     starting_date.add(time_zone_adj);
     ending_date.add(time_zone_adj);

     var schedule = new GlideSchedule(inputs.schedule_sys_id);
     var duration = schedule.duration(starting_date, ending_date);
     //outputs.message = "Schedule Duration: " + duration.getDurationValue();

     outputs.starting_date = starting_date;
     outputs.ending_date = ending_date;
     outputs.duration = duration;

})(inputs, outputs);

One thing I figured out is that my dates were Local Timezone and GlideDateTime assumes they are UTC.  So I had to add 8 hours to the start and end dates.

I also dropped the getDurationValue from the assignment of outputs.duration.

ServiceNow is good at converting dates of various formats to a standard time.