Usando DurationCalculator para calcular uma data de vencimento

  • Versão de lançamento: Zurich
  • Atualizado 31 de jul. de 2025
  • 7 min. de leitura
  • Usando a inclusão de script DurationCalculator, você pode calcular uma data de vencimento, usando uma duração simples ou uma duração relativa com base em cronogramas.

    O script a seguir demonstra como usar a API global DurationCalculator para calcular uma data de vencimento. A primeira parte do script ilustra como definir uma data/hora de início usando SetStartDateTime() e, em seguida, use o. CalcDuration() método para determinar uma data de vencimento que seja "x" de tempo contínuo (segundos) a partir da data/hora de início especificada. A segunda metade do script ilustra como usar DurationCalculator para calcular uma data de vencimento com base em uma programação. Os cronogramas permitem que você aplique um "filtro" no horário futuro, como incluir somente os dias de uma semana de trabalho no cálculo. Por exemplo, se você aplicar uma programação "Dias da semana" (que inclui somente de segunda a sexta-feira) ao seu cálculo de duração e a data/hora de início for sexta-feira às 5:00 horas, quando você adicionar uma duração de dois dias, sua data de vencimento será terça-feira às 5:00 horas. Se você não usou uma programação, sua data de vencimento seria domingo, às 5:00 horas. Para obter informações adicionais sobre cronogramas, consulte Criação e uso de cronogramas .

    Este script pode ser cortado e colado na página de plano de fundo de scripts e executado como está. Ele também pode servir como exemplo para criar regras de negócios, ações de IU ou usar qualquer outro local em que o script do lado do servidor possa ser criado.
    /**
     * 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");
    }

    Usando DurationCalculator para calcular uma duração simples

    Uma duração simples é o número de segundos entre duas datas e horas.

    Se nenhuma programação for usada, esta será uma subtração de data e hora simples. Se uma programação for usada, a programação será consultada para remover horas não úteis do cálculo. Suponha que a programação "8-5 dias úteis excluindo feriados" seja usada. Nesse caso, o número de horas de trabalho do meio-dia de segunda-feira ao meio-dia de terça-feira é de nove horas. Para calcular uma duração simples, inicialize a API global DurationCalculator e ligue para CalcScheduleDuration() método.

    Este script demonstra como usar DurationCalculator para calcular uma duração simples.
    /**
     * 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());
    }

    Usando duração relativa

    A duração relativa é muito semelhante à duração simples, exceto que uma parte do script é usada para determinar quais partes de um dia serão removidas do cálculo de diferença.

    Este script é armazenado na tabela cmn_relative_duration e pode ser examinado navegando até Scheduler do Sistema > Agendamentos > Durações Relativas. Há alguns exemplos de scripts de duração relativa na instância pronta para uso.

    Uma duração relativa sys_id é passada para o método CalcRelativeDuration() Da API global DurationCalculator classe após a inicialização. Quando este método é chamado, o objeto DurationCalculator é passado para o script de duração relativa (armazenado na tabela cmn_relative_duration) como a variável calculadora . Portanto, o script de duração relativa que você escreve e armazena em cmn_relative_duration tem acesso à execução da DurationCalculator por meio da variável calculadora .

    O script a seguir demonstra como usar DurationCalculator para calcular uma duração relativa.
    /**
     * 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");}