Calculate difference bet two dates and set duration.

Tejasr1
Tera Contributor

Hi Team,

I have two fields( start date and end date ) with Date/Time Datatype and durationTime field with duration datatype.

Task:On change of end date ,calculate difference bet two dates and set duration with format days,hours,minutes,seconds. (ddd:HH:mm:ss)

I write script include with GlideAjax but it only calculate number of days.I want to calculate hours,minutes,seconds also.what changes I need to do in existing script?

Script Include:
var CalculateDate = Class.create();
CalculateDate.prototype = Object.extendsObject(AbstractAjaxProcessor, {
    calculateDatediff: function() {
        var startDate = this.getParameter('sysparm_start_date');
        var endDate = this.getParameter('sysparm_end_date');
        var gdt1 = new GlideDateTime(startDate);
        var gdt2 = new GlideDateTime(endDate);
        var dur = GlideDateTime.subtract(gdt1, gdt2);
        return dur.getDisplayValue();
        // }
    },
    type: 'CalculateDate'
});

On change Client Script:
function onChange(control, oldValue, newValue, isLoading, isTemplate) {
    if (isLoading || newValue === '') {
        return;
    }
    var ga = new GlideAjax('CalculateDate'); // CalculateDate is the script include name
    ga.addParam('sysparm_name', 'calculateDatediff'); // calculateDatediff is the function in the script include that we're calling
    ga.addParam('sysparm_start_date', g_form.getValue('u_startdate')); // get start date
    ga.addParam('sysparm_end_date', g_form.getValue('u_enddate')); // get end date
    ga.getXMLAnswer(DateParse);
}

// callback function for returning the result from the script include
function DateParse(response) {
    g_form.setValue('u_durationtime', response);

}

 

 

 

Thanks
Tejas

1 ACCEPTED SOLUTION

Tai Vu
Kilo Patron
Kilo Patron

Hi @Tejasr1 

Let's use the API below, it will return the difference between the two dates in the format ddd hh:mm:ss.

dateDiff(String startDate, String endDate, Boolean numericValue)

Returns
Type Description
StringIf the numericValue parameter is true, returns the difference between the two dates as an integer number of seconds; if false, returns the difference between the two dates in the format ddd hh:mm:ss.

 

Try the below adjustment.

 

function onChange(control, oldValue, newValue, isLoading) {
    if (isLoading) {
        return;
    }

    if (newValue === '') {
        g_form.clearValue('duration');
    }

	//Use this to convert from user to system format
	//If your instance use system format only, just ignore it
	var start_date = getDateFromFormat(g_form.getValue('u_startdate'), g_user_date_time_format);
	var format_start_date = formatDate(new Date(start_date), "yyyy-MM-dd hh:mm:ss");

	var end_date = getDateFromFormat(g_form.getValue('u_enddate'), g_user_date_time_format);
	var format_end_date = formatDate(new Date(end_date), "yyyy-MM-dd hh:mm:ss");

    var ga = new GlideAjax('CalculateDate');
    ga.addParam('sysparm_name', 'calculateDatediff');
    ga.addParam('sysparm_start_date', format_start_date);
    ga.addParam('sysparm_end_date', format_end_date);
    ga.getXMLAnswer(function(response) {
		g_form.setValue('u_durationtime', response);
    });
	
}
var CalculateDate = Class.create();
CalculateDate.prototype = Object.extendsObject(AbstractAjaxProcessor, {
    calculateDatediff: function() {
		var start = this.getParameter('sysparm_start_date');
		var end = this.getParameter('sysparm_end_date');
		var duration = gs.dateDiff(start, end);
		return duration;
    },
    type: 'CalculateDate'
});

 

 

 

Cheers,

Tai Vu

View solution in original post

5 REPLIES 5

Anil Lande
Kilo Patron

Hi,

Please check below link:

https://www.servicenow.com/community/itsm-forum/calculate-duration-between-start-and-end-date/m-p/48...

 

Instead of  using

var dur = GlideDateTime.subtract(gdt1, gdt2);

Use

var dur = gs.dateDiff(gdt1.getDisplayValueInternal(),gdt2.getDisplayValueInternal(),false);

Please appreciate the efforts of community contributors by marking appropriate response as correct answer and helpful, this may help other community users to follow correct solution in future.
Thanks
Anil Lande

Mohan raj
Mega Sage

Hi @Tejasr1,

 

To get duration with format days, hours, minutes, seconds. (ddd:HH:mm:ss)

For example : 

19683 Days 13 Hours 35 Minutes

Try the below script it may help you to achieve the format

var openedAt = current.sys_created_on; // start date
    var closedAt = current.sys_updated_on; // end date
    var diff = gs.dateDiff(openedAt, closedAt, true); // difference in milli seconds
    var d = Math.floor(diff / (3600 * 24));
    var h = Math.floor(diff % (3600 * 24) / 3600);
    var m = Math.floor(diff % 3600 / 60);
    var s = Math.floor(diff % 60);
	var time = d+' Days '+h+' hours '+m+' min '+s+'seconds';
    gs.print(time);

 

If my response helps you to resolve the issue close the question by Accepting solution and hit thumb icon. From Correct answers others will get benefited in future.

 

 

Tai Vu
Kilo Patron
Kilo Patron

Hi @Tejasr1 

Let's use the API below, it will return the difference between the two dates in the format ddd hh:mm:ss.

dateDiff(String startDate, String endDate, Boolean numericValue)

Returns
Type Description
StringIf the numericValue parameter is true, returns the difference between the two dates as an integer number of seconds; if false, returns the difference between the two dates in the format ddd hh:mm:ss.

 

Try the below adjustment.

 

function onChange(control, oldValue, newValue, isLoading) {
    if (isLoading) {
        return;
    }

    if (newValue === '') {
        g_form.clearValue('duration');
    }

	//Use this to convert from user to system format
	//If your instance use system format only, just ignore it
	var start_date = getDateFromFormat(g_form.getValue('u_startdate'), g_user_date_time_format);
	var format_start_date = formatDate(new Date(start_date), "yyyy-MM-dd hh:mm:ss");

	var end_date = getDateFromFormat(g_form.getValue('u_enddate'), g_user_date_time_format);
	var format_end_date = formatDate(new Date(end_date), "yyyy-MM-dd hh:mm:ss");

    var ga = new GlideAjax('CalculateDate');
    ga.addParam('sysparm_name', 'calculateDatediff');
    ga.addParam('sysparm_start_date', format_start_date);
    ga.addParam('sysparm_end_date', format_end_date);
    ga.getXMLAnswer(function(response) {
		g_form.setValue('u_durationtime', response);
    });
	
}
var CalculateDate = Class.create();
CalculateDate.prototype = Object.extendsObject(AbstractAjaxProcessor, {
    calculateDatediff: function() {
		var start = this.getParameter('sysparm_start_date');
		var end = this.getParameter('sysparm_end_date');
		var duration = gs.dateDiff(start, end);
		return duration;
    },
    type: 'CalculateDate'
});

 

 

 

Cheers,

Tai Vu

Tejasr1
Tera Contributor

It's Working.
Thanks @Tai Vu