Calculate duration based on start and end time

Priyanka Chaud1
Tera Contributor

Hi folks,

I have start and end date variable in catalog item form...I have created duration field which calculates the duration between start and end date in hours..I have developed that using script include and client script but now the client wants to include time in hours and minutes as well like if we select start date as 9 AM to end date 10:30 AM it should give 1 hour 30 minutes.Currently its giving only 1 Hour... please let me know the changes in script to achieve this @Ankur Bawiskar @Anil Lande @suvro @HrishabhKumar 

 

 
1 ACCEPTED SOLUTION

Sandeep Rajput
Tera Patron
Tera Patron

@Priyanka Chaud1 Please update your script include as follows.

 

var durationcalculation = Class.create();
durationcalculation.prototype = Object.extendsObject(AbstractAjaxProcessor, {
  fetchDate: function() {
      var getStartDate = this.getParameter('sysparm_end1');
        var getEndDate = this.getParameter('sysparm_end');
        var start = new GlideDateTime(getStartDate);
        var end = new GlideDateTime(getEndDate);
        var hours=GlideDateTime.subtract(start, end);
        return hours.getDisplayValue(); //retunrs value like 3 Hours 40 Minutes
    },

    type: 'durationcalculation'
});

 

Please update your client script as follows.

 

var startDate = g_form.getValue('outage_start_date_time');
var endDate = g_form.getValue('outage_end_date_time');
if(startDate=='' && newValue!=''){
    g_form.addErrorMessage('Please fill in start date first');
    g_form.clearValue('outage_end_date_time');
}
if (new Date(startDate) > new Date(endDate)) {
        g_form.addErrorMessage('End date/time should be later than start date/time');
        g_form.clearValue('outage_end_date_time');
       
    }
 var gaPhone = new GlideAjax('durationcalculation');
    gaPhone.addParam('sysparm_name', 'fetchDate');
    gaPhone.addParam('sysparm_end1', g_form.getValue('outage_start_date_time'));
    gaPhone.addParam('sysparm_end', g_form.getValue('outage_end_date_time'));
    gaPhone.getXMLAnswer(_handleResponse);

    function _handleResponse(response) {
        var answer = response;
       
        g_form.setValue('duration', answer);
}

 

Hope this helps.

View solution in original post

3 REPLIES 3

Yashsvi
Kilo Sage

Hi @Priyanka Chaud1,

script include:

var durationcalculation = Class.create();
durationcalculation.prototype = Object.extendsObject(AbstractAjaxProcessor, {
    fetchDate: function() {
        var getStartDate = this.getParameter('sysparm_end1');
        var getEndDate = this.getParameter('sysparm_end');
        var start = new GlideDateTime(getStartDate);
        var end = new GlideDateTime(getEndDate);

        // Calculate duration in milliseconds
        var durationMs = start.subtract(end).getNumericValue();
        
        // Convert duration to hours and minutes
        var hours = Math.floor(durationMs / (1000 * 60 * 60));
        var minutes = Math.floor((durationMs % (1000 * 60 * 60)) / (1000 * 60));

        return hours + ' hours ' + minutes + ' minutes';
    },

    type: 'durationcalculation'
});

Client Script:

var startDate = g_form.getValue('outage_start_date_time');
var endDate = g_form.getValue('outage_end_date_time');

if (startDate == '' && endDate != '') {
    g_form.addErrorMessage('Please fill in start date first');
    g_form.clearValue('outage_end_date_time');
    return;
}

if (new Date(startDate) > new Date(endDate)) {
    g_form.addErrorMessage('End date/time should be later than start date/time');
    g_form.clearValue('outage_end_date_time');
    return;
}

var gaPhone = new GlideAjax('durationcalculation');
gaPhone.addParam('sysparm_name', 'fetchDate');
gaPhone.addParam('sysparm_end1', g_form.getValue('outage_start_date_time'));
gaPhone.addParam('sysparm_end', g_form.getValue('outage_end_date_time'));
gaPhone.getXMLAnswer(_handleResponse);

function _handleResponse(response) {
    var answer = response;
    g_form.setValue('duration', answer);
}

Thank you, please make helpful if you accept the solution.

Thanks for the reply @Yashsvi but i tried this is not working

Sandeep Rajput
Tera Patron
Tera Patron

@Priyanka Chaud1 Please update your script include as follows.

 

var durationcalculation = Class.create();
durationcalculation.prototype = Object.extendsObject(AbstractAjaxProcessor, {
  fetchDate: function() {
      var getStartDate = this.getParameter('sysparm_end1');
        var getEndDate = this.getParameter('sysparm_end');
        var start = new GlideDateTime(getStartDate);
        var end = new GlideDateTime(getEndDate);
        var hours=GlideDateTime.subtract(start, end);
        return hours.getDisplayValue(); //retunrs value like 3 Hours 40 Minutes
    },

    type: 'durationcalculation'
});

 

Please update your client script as follows.

 

var startDate = g_form.getValue('outage_start_date_time');
var endDate = g_form.getValue('outage_end_date_time');
if(startDate=='' && newValue!=''){
    g_form.addErrorMessage('Please fill in start date first');
    g_form.clearValue('outage_end_date_time');
}
if (new Date(startDate) > new Date(endDate)) {
        g_form.addErrorMessage('End date/time should be later than start date/time');
        g_form.clearValue('outage_end_date_time');
       
    }
 var gaPhone = new GlideAjax('durationcalculation');
    gaPhone.addParam('sysparm_name', 'fetchDate');
    gaPhone.addParam('sysparm_end1', g_form.getValue('outage_start_date_time'));
    gaPhone.addParam('sysparm_end', g_form.getValue('outage_end_date_time'));
    gaPhone.getXMLAnswer(_handleResponse);

    function _handleResponse(response) {
        var answer = response;
       
        g_form.setValue('duration', answer);
}

 

Hope this helps.