DurationCalculator を使用して期日を計算する

  • リリースバージョン: Washingtondc
  • 更新日 2024年02月01日
  • 読む16読むのに数分
  • DurationCalculator スクリプトインクルードを使用すると、単純な期間またはスケジュールに基づく相対期間を使用して、期日を計算できます。

    次のスクリプトは、グローバル API DurationCalculator を使用して期日を計算する方法を示しています。スクリプトの最初の部分は、setStartDateTime() メソッドを使用して開始日時を設定し、calcDuration() メソッドを使用して、指定された開始日時から経過した連続時間「x」(秒数) で期日を決定する方法を示しています。スクリプトの後半は、DurationCalculator を使用してスケジュールに基づいて期日を計算する方法を示しています。スケジュールを使用すると、計算に勤務週の日数のみを含めるなど、将来の時間に対して「フィルター」を適用できます。たとえば、期間の計算に「平日」(月曜日から金曜日のみを含む) というスケジュールを適用し、開始日時が金曜日の 5:00 pm だとすると、2 日間の期間が追加されたときに、期日は火曜日の 5:00 pm となります。スケジュールを使用しなかった場合、期日は日曜日の 5:00 pm になります。スケジュールの詳細については、「スケジュールの作成と使用」を参照してください。

    このスクリプトは切り取って、[スクリプト - バックグラウンド] ページに貼り付け、そのまま実行できます。また、ビジネスルールや UI アクションを作成するためのサンプルとして役立てることができ、サーバーサイドスクリプトを作成できるその他の場所でも使用できます。
    /**
     * Demonstrate the use of DurationCalculator to compute a due date.
     * 
     * You must have a start date and a duration. Then you can compute a
     * due date using the constraints of a schedule.
     */
     
    gs.include('DurationCalculator');
    executeSample();
     
    /**
     * Function to house the sample script.
     */
    function executeSample(){
     
        // First we need a DurationCalculator object.
        var dc = new DurationCalculator();
     
        // --------------- No schedule examples ------------------
     
        // Simple computation of a due date without using a schedule. Seconds
        // are added to the start date continuously to get to a due date.
        var gdt = new GlideDateTime("2012-05-01 00:00:00");
        dc.setStartDateTime(gdt);
        if(!dc.calcDuration(2*24*3600)){ // 2 days
          gs.log("*** Error calculating duration");
          return;
        }
        gs.log("calcDuration no schedule: " + dc.getEndDateTime()); // "2012-05-03 00:00:00" two days later
     
        // Start in the middle of the night (2:00 am) and compute a due date 1 hour in the future
        // Without a schedule this yields 3:00 am.
        var gdt = new GlideDateTime("2012-05-03 02:00:00");
        dc.setStartDateTime(gdt);
        if(!dc.calcDuration(3600)){
          gs.log("*** Error calculating duration");
          return;
         }
        gs.log("Middle of night + 1 hour (no schedule): "+ dc.getEndDateTime()); // No scheduled start date, just add 1 hour
     
     
        // -------------- Add a schedule to the date calculator ---------------------
        addSchedule(dc);
     
        // Start in the middle of the night and compute a due date 1 hour in the future.
        // Since we start at 2:00 am the computation adds the 1 hour from the start
        // of the day, 8:00am to get to 9:00am
        var gdt = new GlideDateTime("2012-05-03 02:00:00");
        dc.setStartDateTime(gdt);
        if(!dc.calcDuration(3600)){
          gs.log("*** Error calculating duration");
          return;
        }
        gs.log("Middle of night + 1 hour (with 8-5 schedule): " + dc.getEndDateTime()); // 9:00 am
     
        // Start in the afternoon and add hours beyond quiting time. Our schedule says the work day
        // ends at 5:00pm, if the duration extends beyond that, we roll over to the next work day.
        // In this example we are adding 4 hours to 3:00pm which gives us 10:00 am the next day.
        var gdt = new GlideDateTime("2012-05-03 15:00:00");
        dc.setStartDateTime(gdt);
    
        if(!dc.calcDuration(4*3600)){ 
          gs.log("*** Error calculating duration");
          return;}
        gs.log("Afternoon + 4 hour (with 8-5 schedule): " + dc.getEndDateTime()); // 10:00 am.
     
        // This is a demo of adding 2 hours repeatedly and examine the result. This
        // is a good way to visualize the result of a due date calculation.
        var gdt = new GlideDateTime("2012-05-03 15:00:00");
        dc.setStartDateTime(gdt); 
        for(var i=2; i<24; i+=1){
          if(!dc.calcDuration(i*3600)){
            gs.log("*** Error calculating duration");
            return;
          }
          gs.log("add "+ i +" hours gives due date: " + dc.getEndDateTime());
        }
     
        // Setting the timezone causes the schedule to be interpreted in the specified timezone.
        // Run the same code as above with different timezone. Note that the 8 to 5 workday is
        // offset by the two hours as specified in our timezone.
        dc.setTimeZone("GMT-2");
        var gdt = new GlideDateTime("2012-05-03 15:00:00");
        dc.setStartDateTime(gdt);
        for(var i=2; i<24; i+=1){
          if(!dc.calcDuration(i*3600)){ 
            gs.log("*** Error calculating duration");
            return;
          }
            gs.log("add "+ i +" hours gives due date (GMT-2): " + dc.getEndDateTime());
        }
    }
     
    /** 
     * Add a specific schedule to the DurationCalculator object.
     *  
     * @param durationCalculator An instance of DurationCalculator
     */
    function addSchedule(durationCalculator){
        // Load the "8-5 weekdays excluding holidays" schedule into our duration calculator.
        var scheduleName = "8-5 weekdays excluding holidays";
        var grSched = new GlideRecord('cmn_schedule');
        grSched.addQuery('name', scheduleName);
        grSched.query();
        if(!grSched.next()){
          gs.log('*** Could not find schedule "'+ scheduleName +'"');
          return;
        }
        durationCalculator.setSchedule(grSched.getUniqueValue(),"GMT");
    }

    DurationCalculator を使用した単純な期間の計算

    単純な期間とは、2 つの日時の間の秒数です。

    スケジュールを使用しない場合は、単純な日時減算になります。スケジュールを使用する場合は、スケジュールを参照して非勤務時間を計算から除外します。「休日を除く平日の 8:00 am ~ 5:00 pm」というスケジュールを使用するとします。この場合、月曜日の正午から火曜日の正午までの勤務時間は 9 時間です。単純な期間を計算するには、グローバル API DurationCalculator を初期化し、calcScheduleDuration() メソッドを呼び出します。

    このスクリプトは、DurationCalculator を使用して単純な期間を計算する方法を示しています。
    /**
     * Sample script demonstrating use of DurationCalculator to compute simple durations
     * 
     */
     
    gs.include('DurationCalculator');
    executeSample();
     
    /**
     * Function to house the sample script.
     */
    function executeSample(){
     
        // First we need a DurationCalculator object.
        var dc = new DurationCalculator();
     
        // Compute a simple duration without any schedule. The arguments
        // can also be of type GlideDateTime, such as fields from a GlideRecord.
        var dur = dc.calcScheduleDuration("2012-05-01", "2012-05-02");
        gs.log("calcScheduleDuration no schedule: " + dur); // 86400 seconds (24 hours)
     
        // The above sample is useful in limited cases. We almost always want to 
        // use some schedule in a duration computation, let's load a schedule.
        addSchedule(dc);
     
        // Compute a duration using the schedule. The schedule
        // specifies a nine hour work day. The output of this is 32400 seconds, or
        // a nine hour span.
        dur = dc.calcScheduleDuration("2012-05-23 12:00:00","2012-05-24 12:00:00");
        gs.log("calcScheduleDuration with schedule: " + dur); // 32400 seconds (9 hours)
     
        // Compute a duration that spans a weekend and holiday. Even though this
        // spans three days, it only spans 9 work hours based on the schedule.
        dur = dc.calcScheduleDuration("2012-05-25 12:00:00", "2012-05-29 12:00:00");
        gs.log("calcScheduleDuration with schedule spaning holiday: " + dur); // 32400 seconds (9 hours)
     
        // Use the current date time in a calculation. The output of this is
        // dependent on when you run it.
        var now = new Date();
        dur = dc.calcScheduleDuration("2012-05-15", new GlideDateTime());
        gs.log("calcScheduleDuration with schedule to now: " + dur); // Different on every run.
    }
     
    /** 
     * Add a specific schedule to the DurationCalculator object.
     *  
     * @param durationCalculator An instance of DurationCalculator
     */
    function addSchedule(durationCalculator){
        // Load the "8-5 weekdays excluding holidays" schedule into our duration calculator.
        var scheduleName = "8-5 weekdays excluding holidays";
        var grSched = new GlideRecord('cmn_schedule');
        grSched.addQuery('name', scheduleName);
        grSched.query();
        if(!grSched.next()){
            gs.log('*** Could not find schedule "'+ scheduleName +'"');
            return;
        }
        durationCalculator.setSchedule(grSched.getUniqueValue());
    }

    相対期間の使用

    相対期間は、差分計算から除外する 1 日の部分をスクリプトを使用して決定すること以外は、単純な期間とよく似ています。

    このスクリプトはテーブルcmn_relative_durationに格納されており、次の場所に移動して確認できます。 システムスケジューラ > スケジュール > 相対期間. すぐに利用可能なインスタンスには、相対期間スクリプトの例がいくつかあります。

    相対期間 sys_id は、初期化後にグローバル API DurationCalculator クラスのメソッド calcRelativeDuration() に渡されます。このメソッドが呼び出されると、DurationCalculator オブジェクトが変数 calculator として相対期間スクリプト (テーブル cmn_relative_duration に格納) に渡されます。したがって、作成して cmn_relative_duration に格納した相対期間スクリプトは、実行中の DurationCalculator に変数 calculator を介してアクセスでき ます。

    次のスクリプトは、DurationCalculator を使用して相対期間を計算する方法を示しています。
    /**
     * Sample use of relative duration calculation.
     * 
     */
     
    gs.include('DurationCalculator');
    executeSample();
     
    /**
     * Function to house the sample script.
     */
    function executeSample(){
     
        // First we need a DurationCalculator object. We will also use
        // the out-of-box relative duration "2 bus days by 4pm"
        var dc = new DurationCalculator();
        var relDur = "3bf802c20a0a0b52008e2859cd8abcf2"; // 2 bus days by 4pm if before 10am
        addSchedule(dc);
     
        // Since our start date is before 10:00am our result is two days from// now at 4:00pm.
        var gdt = new GlideDateTime("2012-05-01 09:00:00");
        dc.setStartDateTime(gdt);
        if(!dc.calcRelativeDuration(relDur)){
          gs.log("*** calcRelativeDuration failed");
          return;
        }
        gs.log("Two days later 4:00pm: "+ dc.getEndDateTime());
     
        // Since our start date is after 10:00am our result is three days from
        // now at 4:00pm.
        var gdt = new GlideDateTime("2012-05-01 11:00:00");
        dc.setStartDateTime(gdt);
        if(!dc.calcRelativeDuration(relDur)){
          gs.log("*** calcRelativeDuration failed");
          return;
        }
        gs.log("Three days later 4:00pm: "+ dc.getEndDateTime());}
     
    /** 
     * Add a specific schedule to the DurationCalculator object.
     *  
     * @param durationCalculator An instance of DurationCalculator
     */
    function addSchedule(durationCalculator){
        // Load the "8-5 weekdays excluding holidays" schedule into our duration calculator.
        var scheduleName ="8-5 weekdays excluding holidays";
        var grSched =new GlideRecord('cmn_schedule');
        grSched.addQuery('name', scheduleName);
        grSched.query();
        if(!grSched.next()){
          gs.log('*** Could not find schedule "'+ scheduleName +'"');
          return;}
        durationCalculator.setSchedule(grSched.getUniqueValue(),"GMT");}