How to get Last Business Day of Month

Supriya25
Tera Guru

Hi all,

I want to send report on Last business day of Month, kindly help me how to fix this issue.

 

 

var sched = new GlideSchedule('08fcd0830a0a0b2600079f56b1adb9ae'); // Check Business day, Exculde Holidays and Weekends //

var d = new GlideDateTime('2023-04-12');
var total_days = d.getDaysInMonth();
var abc = false;
var last_business_day = '';
d.setDayOfMonth(total_days);
while(!abc){
  abc = sched.isInSchedule(d);
   if(!abc){
           d.addDays(-1);
}
}

var business_day = new GlideDateTime(d).getDate();
gs.info('business_day : '+business_day);

 

 

Here I have taken 'April 2023' month , as per above script I'm getting Last working day is 'April 29th' , but April 29th is Saturday.

 

Please help me how to get right Last business Day of Month. what is wrong in my code.?

 

 

1 ACCEPTED SOLUTION

@Supriya25 Use this updated code for both current date and future date testing.

 

//var todayDate = new GlideDate+" 10:00:00";
var todayDate = "2023-09-24 10:00:00";
var startDate = new GlideDateTime(todayDate);
var dayOfMonth = startDate.getDayOfMonthUTC();
var monthOfYear = startDate.getMonthUTC();

var days = 31 - dayOfMonth;

loop:while(true){
    if(days == 0){
        break loop;
    }
    var dur = new GlideDuration(60 * 60 * 24 * 1000 * days);
    var schedule = new GlideSchedule();
    var end = schedule.add(startDate, dur);
    var newMonthOfYear = end.getMonthUTC();

    if(monthOfYear == newMonthOfYear){
    var schedule1 = new GlideSchedule("08fcd0830a0a0b2600079f56b1adb9ae");
    var date = new GlideDateTime();
    date.setDisplayValue(end);
    if(schedule1.isInSchedule(date)){
        gs.info(end);
        break loop;
    }else{
        days--;
    }
    }else{
        days--;
    }
}
 
Please mark all the answers on this questions as correct answers
Please mark the answer as correct or helpful based on impact
ServiceNow Community Rising Star, Class of 2023

View solution in original post

16 REPLIES 16

Bert_c1
Kilo Patron

Hi,

 

I tried your script, it runs for ever, so I tried:

 

var sched = new GlideSchedule('08fcd0830a0a0b2600079f56b1adb9ae'); // Check Business day, Exculde Holidays and Weekends //

var d = new GlideDateTime('2023-04-12');
gs.info("Starting with d = " + d);
var total_days = d.getDaysInMonth();
var abc = false;
var last_business_day = '';
d.setDayOfMonth(total_days);
gs.info("total days = " + total_days + ", checking date d=" + d);
var loopCount = 0;

while(!abc){
  abc = sched.isInSchedule(d);
  gs.info("abc = " + abc);
  if(!abc) {
     d.addDays(-1);
     gs.info("going back a day, d = " + d);
  }
  loopCount++;
  if (loopCount > 5)
    break;
}

var business_day = new GlideDateTime(d).getDate();
gs.info('business_day : '+business_day);

and got:

*** Script: Starting with d = 2023-04-12 00:00:00
*** Script: total days = 30, checking date d=2023-05-01 00:00:00
*** Script: abc = false
*** Script: going back a day, d = 2023-04-30 00:00:00
*** Script: abc = false
*** Script: going back a day, d = 2023-04-29 00:00:00
*** Script: abc = false
*** Script: going back a day, d = 2023-04-28 00:00:00
*** Script: abc = false
*** Script: going back a day, d = 2023-04-27 00:00:00
*** Script: abc = false
*** Script: going back a day, d = 2023-04-26 00:00:00
*** Script: abc = false
*** Script: going back a day, d = 2023-04-25 00:00:00
*** Script: business_day : 2023-04-25

So it seems 'abc' is never getting set to true with your logic, need to see why 'sched.isInSchedule(d);' is not working as expected.  For me, the schedule with sys_id = '08fcd0830a0a0b2600079f56b1adb9ae' is my "8-5 weekdays" schedule.

sys_id = '08fcd0830a0a0b2600079f56b1adb9ae' is  "8-5 weekdays" (exclude holidays and weekends)

 

So please suggest the solution

jaheerhattiwale
Mega Sage
Mega Sage

@Supriya25 100% working code:

 

var gdt = new GlideDateTime();
var dayOfMonth = gdt.getDayOfMonthUTC();
var monthOfYear = gdt.getMonthUTC();

var todayDate = new GlideDate+" 10:00:00";
var startDate = new GlideDateTime(todayDate);

var days = 31 - dayOfMonth;

loop:while(true){
    if(days == 0){
        break loop;
    }
    var dur = new GlideDuration(60 * 60 * 24 * 1000 * days);
    var schedule = new GlideSchedule();
    var end = schedule.add(startDate, dur);
    var newMonthOfYear = end.getMonthUTC();

    if(monthOfYear == newMonthOfYear){
    var schedule1 = new GlideSchedule("08fcd0830a0a0b2600079f56b1adb9ae");
    var date = new GlideDateTime();
    date.setDisplayValue(end);
    if(schedule1.isInSchedule(date)){
        gs.info(end);
        break loop;
    }else{
        days--;
    }
    }else{
        days--;
    }
}
 
Result:
jaheerhattiwale_0-1685624926983.png

 

 

Please mark as correct answer if this solves your issue.

Please mark the answer as correct or helpful based on impact
ServiceNow Community Rising Star, Class of 2023

Thanks for your reply,

 

what is the issue on my code please? can you guide me