Calculate Date in Business Days

Ken83
Mega Guru

Hello Community,

How can I calculate a target date counting business days only? 

Example : User enters start date on catalog item date field - 1/24/2022

Goal : The script should calculate 10 days from the start date considering *business days only* and should populate the end date field with 2/7/2022

 

8 REPLIES 8

Change the glidedatetime to glidedate once Thanks

find_real_file.png

 

var input = "01-24-2022";
var number = 10;

var startDate = new GlideDate();
startDate.setValue(input);
gs.print(startDate);
var days = parseInt(number); //assuming there are 8 business hours

days = days*8;

var dur = new GlideDuration(60 * 60 * 1000 * days);

var schedule = new GlideSchedule(gs.getProperty('cmn_schedule.business_days')); //put your schedule sys_id here

var end = schedule.add(startDate, dur);

gs.print(end);

Hitoshi Ozawa
Giga Sage
Giga Sage

1. Create a schedule "Weekday" that defined to be Mon-Fri. If needed, add holidays as exception.

find_real_file.png

2. Create script. Variable "strDatetime" is the start date. Variable "days" is number of days + 1.

// calculate business days between startDate and endDate
function getBusinessDays(startDate, endDate) {
    var schedule = new GlideSchedule();
    schedule.load('b4560c4597d1011086d3b4b3f153afc1'); // sys_id of weekday schedule
    var duration = schedule.duration(startDate, endDate);
    return duration.getDayPart();
}

// find date that is diffDays before startDate
function getEndDate(startDate, diffDays) {
    var diffTime = 24 * 60 * 60 * 1000;
    var endDate = new GlideDateTime(startDate);

    endDate.subtract(diffTime * diffDays);
    var gtime2 = endDate.getTime();
    var eDate = new GlideDateTime(endDate.getDate() + " 00:00:00");
    return eDate;
}

// find date that is diffDays business days before startDate
function findEndDate(strDatetime, days) {
    var daysApart = days;
	
	var sDate = new GlideDateTime(strDatetime);
    var eDate = getEndDate(strDatetime, daysApart);
    var busiDays = getBusinessDays(eDate, sDate);
    var cnt = 0;
    while (busiDays < days && cnt < 3) {
        daysApart += days - busiDays;
        eDate = getEndDate(strDatetime, daysApart);
        busiDays = getBusinessDays(eDate, sDate);
        cnt++;
    }
    return eDate;
}

var days = 11;  //number of days before + 1
var strDatetime = "2022-01-24 00:00:00";  // start date
var endDate = findEndDate(strDatetime, days);
gs.info("finish end:" + endDate);

Execution result:

Hitoshi,

This is helpful. However, it's counting backwards. The end_date should be 10 days into the future, not the past. The calculations seem to be accurate though.