Quem já precisou trabalhar com manipulação de datas em Item de Catálogo sabe o qual terrível isso pode se tornar. Este artigo vamos abordar um pouco sobre como facilitar essa tarefa, convertendo variáveis do tipo Date para um Objeto tipo GlideDate ou GlideDateTime.
Quantas vezes já tive que realizar cálculos de data disparados por eventos do próprio Item de catálogo, tais como, quando um campo X tem um valor Y, o campo de data deve ser DataAtual + 1 dia, ou coisa parecida.
Até ai tudo tranquilo, o problema começa quando o usuário visualizando o Item de Catálogo usa um formato de data diferente do padrão do sistema, que pode causar uma verdadeira zona na hora de fazer o parsing dessa informação.
Váriaveis do tipo Date guardam o valor selecionado no formato de texto simples, então a página pode tanto exibir uma data de “10 de março de 2023” como 10/03/2023 (padrão brasileiro) como 03/10/2023 (padrão americano). E aí? Vai criar um script que vai tentar adivinhar qual parte dessa string é mês e qual é dia? Complicado né.
Observação importante: A classe GlideDate/GlideDateTime não está disponível em client-side!
A grande sacada é associar a String que representa o valor da data com o formato de data que o usuário atual está usando (linha 3). Desta forma, utilizando essa referência para definir o formato da data lida e se necessário convertê-lo para qualquer outro formato!
Para estes casos, veja snippet utilizando GlideDate:
var testedDate = '10/31/2021'; var formatDate = gs.getSession().getUser().getDateFormat(); gs.print(formatDate); //*** Script: MM/dd/yyyy var gd = new GlideDate(); gd.setDisplayValue(testedDate , formatDate ); gs.print(gd); //*** Script: 2021-10-31 // Convertendo para format BR formatDate = 'dd/MM/yyyy'; gs.print(gd.getByFormat(formatDate)); //*** Script: 31/10/2021
Bacana né? Bem simples de usar. O único problema de usar GlideDate é que caso você queira somar/subtrair dias, não há uma forma fácil de fazer isso. Para estes casos, o recomendado é utilizar a classe GlideDateTime, mesmo que não desejemos usar horas. Veja o código abaixo com GlideDateTime:
var testedDate = '10/31/2021'; var formatDate = gs.getSession().getUser().getDateFormat(); gs.print(formatDate); //*** Script: MM/dd/yyyy var gdt = new GlideDateTime(); gdt.setDisplayValue(testedDate, formatDate ); // Data antes da soma de 1 dia gs.print(gdt.getDate()); //*** Script: 2021-10-31 04:00:00 // Somando um dia gdt.addDaysLocalTime(1); gs.print(gdt.getDate()); //*** Script: 2021-11-01 04:00:00 // Agora vamos converter a data atual para o formato do usuário var gd = new GlideDate(); gd.setDisplayValue(gdt.getDate(), 'yyyy-MM-dd'); gs.print(gd.getByFormat(formatDate)); //*** Script: 11/01/2021
Com o uso do método getDate(), o GlideDateTime vai te retornar somente a parte da data, que é o que interessa para nós neste momento!
Então caso você precise fazer algum calculo de data com variáveis, você pode criar um Client Script com uma chamada Ajax, que passe como referência a sua data selecionada, o incremento de dias (caso seja variável) e o Ajax retornará uma string com a nova data para sua variável do tipo Data.
Caso você queira saber mais sobre Ajax, confira o artigo abaixo.