ServiceNow提供的官方scheduleAPI 中有一个add方法。
Scoped GlideSchedule - add(GlideDateTime startDate, GlideDuration offSet)

*parameter1:
Name:startDate
Type:GlideDateTime
Description:The starting date of the new schedule segment.

parameter2:
Name:offSet
Type:GlideDuration
Description:The time offset of the new schedule segment.*

example:

var startDate = new GlideDateTime('2014-01-02');
var days = 2;
var dur = new GlideDuration(60 * 60 * 24 * 1000 * days);
var schedule = new GlideSchedule();
var end = schedule.add(startDate, dur);
gs.info(end);
//Output: 2014-01-04 00:00:00

但是 这个方法中parameter2 duration不能小于零。所以利用该方法我们只能求schedule中未来的日期,无法往前推算日期。

name问题来了,当我们想得到schedule中某一特定日期前3天(schedule里的3天而非calendar的3天)的日期应该怎么办呢?

ok下面上干货。

思路

1 GlideDateTime.addDaysLocalTime() 参数可以为负数;
2 简单的利用一个for循环;

/**
endTime is string
workDay type is int
**/
this._schedule = ‘*******************’;
getWorkDateInSchedule: function(endTime,workDay){   
var inter = 1;
if(workDay<0){
//workDay <0 特定日期往前推
    inter = -1;
    var workDayABS = Math.abs(workDay);
    var gt_end = new GlideDateTime(endTime);
    var sched = new GlideSchedule(this._schedule);
    var startWorkDate;
    var inte = 0;
    for(var i = 0; ; i++){
        //GlideDateTime.addDaysLocalTime() 参数可以为负数;
        gt_end.addDaysLocalTime(inter);
            if(sched.isInSchedule(gt_end)){
            inte = inte + 1;
        }
        if(inte == workDayABS){
            break;
        }
    }
    startWorkDate = gt_end;
    return startWorkDate.getDate().toString();
}
else{
// workDay > 0 特定日期往后推时就调用官方api
    var schedule = new GlideSchedule(this._schedule);
    var end = schedule.add(endTime, dur);
    return = end.getDate().toString();
}
},