Welcome to Community Week 2025! Join us to learn, connect, and be recognized as we celebrate the spirit of Community and the power of AI. Get the details  

Script para comparar data início com data atual

Alan Carvalho
Tera Contributor

Olá comunidade!

 

Realizei a criação de um item de catálogo onde preciso restringir que o usuário informe uma data inicial maior que 7 dias a partir da data atual. Obs: Tenho outras regras que envolvem essa data inicial e essas funcionam normalmente.

Para isso, configurei um script include com a seguinte parte do código para tratar essa regra:

AlanCarvalho_0-1683826276676.png

 

Ao inserir a data na variável do item de catálogo, a regra funciona restringindo a inserção apenas dos dias entre 19 e 31 de qualquer mês, seja ele o atual o subsequente. Ex: Ao preencher a variável com a data 19/05/2023 a regra é acionada e funciona perfeitamente, porém ao inserir o dia 01/06/2023 a regra não é acionada.

AlanCarvalho_1-1683826331176.pngAlanCarvalho_2-1683826360838.png

 

AlanCarvalho_4-1683826427714.pngAlanCarvalho_5-1683826450083.pngAlanCarvalho_6-1683826473749.pngAlanCarvalho_7-1683826501301.png

 

Alguém pode me ajudar a identificar qual o erro e como devo corrigir?

 

 

1 ACCEPTED SOLUTION

Leonardo Bentes
ServiceNow Employee
ServiceNow Employee

Olá Alan,

 

Me parece que o problema é que você está comparando as datas no formato 'dd/MM/yyyy'. No seu exemplo, quando o if comparar '11/05/2023' com '01/06/2023', 11/05 será maior que 01/06, pois o "1" (primeiro dígito da data de maio) é maior que "0" (primeiro dígito da data de junho). Quando se lida com datas, é um boa prática usar o formato ano + mes + dia, pois assim as comparações serão feitas como esperamos.

 

Experimente rodar este teste no background script para verificar o comportamento:

 

if ('01/06/2023' > '19/05/2023') {
    gs.info('é maior');
} else {
    gs.info('não é maior');
}

if ('2023/06/01' > '2023/05/19') {
    gs.info('é maior');
} else {
    gs.info('não é maior');
}
 

Então, se você trocar a formatação de 'dd/MM/yyyy' para 'yyyy/MM/dd' deve resolver o problema. Inclusive a barra nem é necessária neste caso, podendo usar 'yyyyMMdd'.

 

Além disso, vale a pena dar um olhada no método getValue(). Ao executar (com base no seu exemplo) 

gs.info(dateInicial.getValue())
você terá como retorno '2023-05-19'. Ou seja, já num formato mais adequado para comparação. Assim, se você quiser "enxugar" seu código, pode fazer algo na seguinte linha:
 
var dateInicial = this.perParameter('sysparm_startDate');
dateInicial = new GlideDateTime(dateInicial);
dateInicial = dateInicial.getDate();
 
var today = new GlideDate();
today.addDaysUTC(7);

if (dateInicial.getValue() > today.getValue()) {
   return '3';
}
 
Boa sorte,
 
Leo
 

View solution in original post

3 REPLIES 3

Leonardo Bentes
ServiceNow Employee
ServiceNow Employee

Olá Alan,

 

Me parece que o problema é que você está comparando as datas no formato 'dd/MM/yyyy'. No seu exemplo, quando o if comparar '11/05/2023' com '01/06/2023', 11/05 será maior que 01/06, pois o "1" (primeiro dígito da data de maio) é maior que "0" (primeiro dígito da data de junho). Quando se lida com datas, é um boa prática usar o formato ano + mes + dia, pois assim as comparações serão feitas como esperamos.

 

Experimente rodar este teste no background script para verificar o comportamento:

 

if ('01/06/2023' > '19/05/2023') {
    gs.info('é maior');
} else {
    gs.info('não é maior');
}

if ('2023/06/01' > '2023/05/19') {
    gs.info('é maior');
} else {
    gs.info('não é maior');
}
 

Então, se você trocar a formatação de 'dd/MM/yyyy' para 'yyyy/MM/dd' deve resolver o problema. Inclusive a barra nem é necessária neste caso, podendo usar 'yyyyMMdd'.

 

Além disso, vale a pena dar um olhada no método getValue(). Ao executar (com base no seu exemplo) 

gs.info(dateInicial.getValue())
você terá como retorno '2023-05-19'. Ou seja, já num formato mais adequado para comparação. Assim, se você quiser "enxugar" seu código, pode fazer algo na seguinte linha:
 
var dateInicial = this.perParameter('sysparm_startDate');
dateInicial = new GlideDateTime(dateInicial);
dateInicial = dateInicial.getDate();
 
var today = new GlideDate();
today.addDaysUTC(7);

if (dateInicial.getValue() > today.getValue()) {
   return '3';
}
 
Boa sorte,
 
Leo
 

Olá @Leonardo Bentes,

 

Continuo na saga para resolver esse problema.

Segui as suas orientações de formatação de data e de "enxugar" o código mais ainda continua com o problema na comparação.

Vou adicionar aqui os dois scripts envolvidos nesse processo, os quais foram desenvolvidos por parceiro ServiceNow e não tenho mais o suporte do mesmo.

 

Esse é o Script do cliente de catálogo:

function onChange(control, oldValue, newValue, isLoading) {
    if (isLoading || newValue == '') {
        return;
    }
 
    //Clears the value of fields and shows message in the fields when the values do not respect the rules assigned to them.
    var startDate = g_form.getValue('u_data_inicial');
    var endDate = g_form.getValue('u_data_final');
 
if (endDate != "" && endDate < startDate) {
g_form.clearValue('u_data_final');
g_form.showFieldMsg('u_data_final', getMessage('The End Date cannot be less than the Start Date'), 'error', true);
}
 
    if (startDate == endDate) {
        g_form.clearValue('u_data_inicial');
        g_form.showFieldMsg('u_data_inicial', getMessage('The Start Date and End Date cannot be the same'), 'error', true);
    }
 
    var ajax = new GlideAjax('AjaxDurCalc');
 
    ajax.addParam('sysparm_name', 'durCalc2');
    ajax.addParam('sysparm_startDate', startDate);
    ajax.addParam('sysparm_endDate', endDate);
    ajax.getXML(callback);
 
    function callback(response) {
        var answer = response.responseXML.documentElement.getAttribute("answer");
        if (answer == '1') {
            g_form.clearValue('u_data_inicial');
            g_form.clearValue('u_data_final');
            g_form.showFieldMsg('u_data_final', getMessage('Start Date and End Date cannot exceed 8 hours difference'), 'error', true);
        } else if (answer == '2') {
            g_form.clearValue('u_data_inicial');
            g_form.clearValue('u_data_final');
            g_form.showFieldMsg('u_data_final', getMessage('The Start Date and End Date cannot be on different days'), 'error', true);
        } else if (answer == '3') {
            g_form.clearValue('u_data_inicial');
            g_form.showFieldMsg('u_data_inicial', getMessage('The Start Date cannot be more than 7 days from today'), 'error', true);
        }
 
    }
}
 
Esse é o Scipt Include:
var AjaxDurCalc = Class.create();
AjaxDurCalc.prototype = Object.extendsObject(AbstractAjaxProcessor, {
 
    durCalc: function() {
        var dateInicial = (this.getParameter('sysparm_startDate'));
dateInicial = new GlideDateTime(dateInicial);
dateInicial = dateInicial.getDate();
dateInicial = dateInicial.getByFormat('dd/MM/yyyy');
 
var dateFinal = (this.getParameter('sysparm_endDate'));
dateFinal = new GlideDateTime(dateFinal);
dateFinal = dateFinal.getDate();
dateFinal = dateFinal.getByFormat('dd/MM/yyyy');
 
if (dateFinal != dateInicial){
return "2";
}
var diferenceDate = gs.dateDiff(this.getParameter('sysparm_startDate'), this.getParameter('sysparm_endDate'), true);
diferenceDate = diferenceDate / 3600;
if (diferenceDate > 8){
return "1";
}
 
    },
 
durCalc2: function() {
 
        var dateInicial = (this.getParameter('sysparm_startDate'));
dateInicial = new GlideDateTime(dateInicial);
 
dateInicial = dateInicial.getDate();
var today = new GlideDate();
today.addDaysUTC(7);
gs.info(today);
if (dateInicial.getValue() > today.getValue()){
return '3';
}
 
dateInicial = dateInicial.getByFormat('dd/MM/yyyy');
 
var dateFinal = this.getParameter('sysparm_endDate');
dateFinal = new GlideDateTime(dateFinal);
dateFinal = dateFinal.getDate();
dateFinal = dateFinal.getByFormat('dd/MM/yyyy');
 
 
 
if (dateFinal != dateInicial){
return "2";
}
var diferenceDate = gs.dateDiff(this.getParameter('sysparm_startDate'), this.getParameter('sysparm_endDate'), true);
diferenceDate = diferenceDate / 3600;
if (diferenceDate > 8){
return "1";
}
 },
 
    type: 'AjaxDurCalc'
});

 

Será que ainda consegue me ajudar?

Elicio_Junior
Tera Contributor

Veja se esse código possa lhe ajudar:

Deixei ele genérico pra poder aplicar tanto em SI Server Side quanto Client fazendo os devidos ajustes.

var initialDateFromClient = '2023-07-03 18:00:00'

var initDate = new GlideDateTime(initialDateFromClient)
var now = new GlideDateTime()

gs.info('Data Atual: '+now) //Debug

now.addDaysUTC(7)
gs.info('Data Máxima: '+now) //Debug

gs.info('Data Inicial Escolhida: '+initDate) //Debug

/* 
Equals (0)
initDate is after now(1)
initDate is before now(-1)
*/
var dur = initDate.compareTo(now)

gs.info(dur) //Debug

if(dur == 1){
    gs.info('Data não permitida')
} else {
    gs.info('Data permitida')
}