Adding and setting date field on client side

jamesmcwhinney
Giga Guru

From the client side, I am trying to autopopulate an end date field after the start date field has been entered.

Here is my current code:

Catalog Client Script - OnChange - StartDate

function onChange(control, oldValue, newValue, isLoading) {

    if (isLoading || newValue == '') {

          return;

    }

  var str_start = g_form.getValue('start_datetime');

  var dt_start = new Date(str_start);

  var addDays = 30;

  var dt_end = new Date(str_start);

  dt_end.setDate(dt_end.getDate() + addDays);

  var month = "" + (dt_end.getMonth() + 1); //Not sure why I need to add 1 but I do for some reason. is January month zero??

  if(month.length < 2){

        month = '0' + month;

  }

  var day = "" + dt_end.getDate();

  if(day.length < 2){

      day = '0' + day;

  }

  var year = dt_end.getFullYear();

  g_form.setValue('end_datetime', year + "-" + month + "-" + day);

}

This works fine when the current user's ServiceNow profile is set to yyyy-mm-dd, but not if it is any other date format.

Could anyone offer any suggestions?

Thanks!

- James

6 REPLIES 6

ccajohnson
Kilo Sage

I took pieces from my own script include that should get the dates you need. Here is the script include:



var dateTimeUtilAjax = Class.create();


dateTimeUtilAjax.prototype = Object.extendsObject(global.AbstractAjaxProcessor, {



      getNowAdd: function() {


              var firstDT = this.getParameter('sysparm_fdt');


              var lookVar = this.getParameter('sysparm_add');


              var dFmt = this.getParameter('sysparm_fmt');


              if (!dFmt) {


                      dFmt = this._getDateFormat();


              }


              var fstDT = '';


              if (firstDT) {


                      fstDT = this._makeDateTimeStr(firstDT, dFmt);


              } else {


                      fstDT = this._makeDateTimeStr(gs.nowDateTime(), dFmt);


              }


              var conDT = this._addLookAhead(fstDT, lookVar);


              return this._setDateTime(conDT, 'toUser', dFmt);


      },



      _addLookAhead: function(dateTime, lookVar, pad) {


              var addTYPE = lookVar.split('-')[0];


              addTYPE = addTYPE.toLowerCase();


              var addTIME = lookVar.split('-')[1];


              if (lookVar.split('-')[2] == 'before') {


                      addTIME = '-' + addTIME;


              }


              var result = new GlideDateTime(dateTime);


              if (pad) {result.addSeconds(pad);}


              if (addTYPE == 'min') {result.addSeconds(addTIME * 60);}


              if (addTYPE == 'hr') {result.addSeconds(addTIME * (60 * 60));}


              if (addTYPE == 'day') {result.addDays(addTIME);}


              if (addTYPE == 'wk') {result.addWeeks(addTIME);}


              if (addTYPE == 'mo') {result.addMonths(addTIME);}


              if (addTYPE == 'yr') {result.addYears(addTIME);}


              return result;


      },



      _getDateFormat: function() {


              var usr = new GlideRecord('sys_user');


              usr.get(gs.getUserID());


              var usr_date = usr.date_format;


              var sys_date = gs.getProperty('glide.sys.date_format');


              var result = '';


              if (!usr_date) {


                      result = sys_date;


              } else {


                      result = usr_date;


              }


              return result;


      },



      _getTzFormat: function() {


              var usr = new GlideRecord('sys_user');


              usr.get(gs.getUserID());


              var usr_zone = usr.time_zone;


              var sys_zone = gs.getProperty('glide.sys.default.tz');


              var result = '';


              if (!usr_zone) {


                      result = sys_zone;


              } else {


                      result = usr_zone;


              }


              return result;


      },



      _makeDateTimeStr: function(dateTime, dFmt) {


              if (!dFmt) {


                      dFmt = this._getDateFormat();


              }


              var nowDT = new GlideDateTime();


              var nowT = nowDT.toString().split(' ')[1];


              var nowH = nowT.split(':')[0];


              var nowM = nowT.split(':')[1];


              var chkDT = dateTime;


              var oDate = dateTime.split(' ')[0];


              var tChk = dateTime.split(' ')[1];


              if (typeof tChk == 'undefined') {


                      chkDT = oDate + ' ' + nowT;


              } else {


                      var hChk = tChk.split(':')[0];


                      var mChk = tChk.split(':')[1];


                      if (typeof mChk == 'undefined') {


                              chkDT = oDate + ' ' + hChk + ':' + nowM + ':00';


                      } else {


                              var sChk = tChk.split(':')[2];


                              if (typeof sChk == 'undefined') {


                                      chkDT = oDate + ' ' + hChk + ':' + mChk + ':00';


                              }


                      }


              }


              return this._setDateTime(chkDT, 'toGlide', dFmt);


      },



      _setDateTime: function(dateTime, type, dFmt, tFmt) {


              if (!dFmt) {


                      dFmt = this._getDateFormat();


              }


              if (!tFmt) {


                    tFmt = this._getTimeFormat();


              }


              var inputFmt = dFmt + ' ' + tFmt;


              var inputTz = this._getTzFormat();


              if (type == 'toUser') {


                      inputFmt = 'yyyy-MM-dd HH:mm:ss';


                      inputTz = 'GMT';


              }


              var input = new Packages.java.text.SimpleDateFormat(inputFmt);


              var tzI = new Packages.java.util.TimeZone.getTimeZone(inputTz);


              input.setTimeZone(tzI);


              dateTime = input.parse(dateTime);


              outputFmt = dFmt + ' ' + tFmt;


              var outputTz = this._getTzFormat();


              if (type == 'toGlide') {


                      outputFmt = 'yyyy-MM-dd HH:mm:ss';


                      outputTz = 'GMT';


              }


              var output = new Packages.java.text.SimpleDateFormat(outputFmt);


              var tzO = new Packages.java.util.TimeZone.getTimeZone(outputTz);


              output.setTimeZone(tzO);


              return output.format(dateTime);


      },



      type: 'dateTimeUtilAjax'


});



Here is the Catalog Client Script:



function onChange(control, oldValue, newValue, isLoading) {


      if (isLoading || newValue == '') {


              return;


      }


      if (newValue != oldValue) {


              var evalDate = newValue;


              var ga = new GlideAjax('dateTimeUtilAjax');


              ga.addParam('sysparm_name', 'getNowAdd');


              ga.addParam('sysparm_fdt', evalDate);


              ga.addParam('sysparm_add', 'day-30');


              ga.addParam('sysparm_fmt', 'g_user_date_format');


              ga.getXML(setDate);


      }


}



function setDate(response) {


      var answer = response.responseXML.documentElement.getAttribute("answer");


      g_form.setValue('end_datetime', answer);


}


Hopefully I got all of the pieces and adjusted to match your variables you use.



Let me know if you have any questions on what each of the functions do.


Abhinay Erra
Giga Sage

Go thru this link. This is a lifesaver


https://jamesfarrer.com/?id=319