Dominando o Cálculo de Intervalos de Datas e Horários

September 3, 2021

É muito comum utilizar um campo Seletor de Datas no formulário. É onde você pode por exemplo:

🔘 Coletar prazos de projetos

🔘 Marcar registros

🔘 Realizar reservas

Em algum momento você poderá precisar calcular o intervalo entre duas datas. Nesta situação, pode ser necessário computar a diferença levando conta até os minutos.

Este artigo vai guiar você para lidar com este processo. Tenha em mente que este guia não pretende ajudar você a construir o formulário inteiro, apenas te orientar a calcular a diferença entre dois campos de data. 

Primeiro, temos que falar sobre Epoch Time. O que é isso?

Uma Unix epoch (ou Unix time ou POSIX time ou Unix timestamp) é o número de segundos que se passaram desde o dia primeiro de janeiro de 1970 (à meia-noite UTC/GMT), sem contar  os chamado segundos bissextos (em ISO 8601: 1970-01-01T00:00:00Z). A rigor, o epoch equivale a Unix 0 (meia noite 1/1/1970), mas “epoch” frequentemente é usado como sinônimo de ‘Unix time’.

Esta definição é citada com base neste link: https://www.epochconverter.com/

É importante que você esteja familiarizado com o Widget Cálculo de Formulário. Se não estiver, nós recomendamos fortemente que você conheça melhor a ferramenta ao ler este guia

Veja abaixo uma tabela mostrando a divisão completa de cada unidade de tempo comum em segundos:

Unidades de tempo habituais Segundos
1 minuto60 segundos
1 hora3600 segundos
1 dia86400 segundos
1 mês (30.44 dias)2629743 segundos
1 ano (365.24 dias)31556926 segundos

Observe a conversão das unidades acima, ela será usada nos nossos cálculos daqui em diante. Agora, vamos conferir alguns pontos chave a respeito de como o Widget Cálculo de Formulário é usado, por que algumas fórmulas são necessárias, e assim por diante:

🔘 O intervalo de tempo entre duas datas precisará estar sempre convertida formato Epoch Time. Por que? Porque quando subtraímos duas datas, a diferença padrão é na unidade dos dias. Para converter um dia em Epoch Time (segundos) nós multiplicamos por 86400.

Fórmula:

(Data2–Data1)*86400

🔘 O resto em um cálculo é importante! 

Os cálculos que você vai fazer frequentemente serão de divisão, e os restos são essenciais para se obter o número de minutos, horas, dias e meses restantes.   

Para por em perspectiva, considere como exemplo uma quantidade de 12345 segundos em epoch time. É o equivalente a 3 horas, 25 minutos e 45 segundos.

Para obter o resultado de 3 horas:

123453600=3.4291666667OU 3 R. 1545

E para obter o resultado de 25 minutos:

154560=25.75OU 25 R. 45

🔘 O widget não oferece uma maneira de obter o resto exato de uma operação de divisão. É possível que você esteja familiarizado com % ou Módulo em linguagens de programação, mas isto não está disponível neste widget. Como alternativa, vamos usar os decimais do quociente para obter o resto.

406=6 R. 4

406=6.6666666667

As duas respostas acima estão corretas e a partir daí obtemos o seguinte:

Número inteiro: 6

Casas Decimais: 0.6666666667

Resto: 4

Para converter os decimais em resto, vamos multiplicar mais uma vez pelo divisor, que é 6. Então:

0.6666666667×6=4.0000000002

Então arredondamos para 4.

Vamos usar a função  floor() para obter o número inteiro a partir do resto. Vale a pena mencionar que floor() é arredondar para baixo, ceil() é arredondar para cima, e round() é arredondar para o número inteiro  mais próximo. Isto irá então ser subtraído do quociente para se obter a casa decimal (como no exemplo acima).

Guia relacionado: Form Calculation Math Function Reference

🔘 A diferença de epoch time deve ser dividida por 2 divisores:

   – 31556926 é o divisor para  Ano, Mês e Dia.

   – 86400 é o divisor para Hora e Minuto.

🔘 Oculte os campos que você não quer mostrar no seu formulário. Geralmente, você não precisa mostrar todos os seus widgets de cálculo (ex. a diferença de epoch time, o campo do resto, e assim por diante).

Eis aqui um formulário de demonstração que pode ser usado com este guia: https://www.jotform.com/71752744778975 . Então vamos começar o passo a passo:

1. Adicione todos os campos necessários

🔘 Dois campos de seletores de data

🔘 Widgets Cálculo de Formulário

Sempre são necessários ao menos dois ou três widgets de cálculo – a Diferença em Epoch e o Resto (para designar ano/mês/minuto ou hora/minuto ou ambos). O resto fica ao seu critério e vai depender de cada situação.

Exemplo:

Se você só precisa obter a diferença em horas e minutos, você vai precisar de 4 widgets de cálculo:

– Diferença em Epoch

– Resto para hora/minuto

– Horas

– Minutos

Se você precisa da diferença em meses, dias, horas, minutos, você vai precisar de 7 widgets de cálculo:

– Diferença em Epoch

– Resto para mês/dia

– Resto para hora/minuto

– Meses

– Dias

– Horas

– Minutos

O formulário demo acima usa 13 Widgets de cálculo:

– 3 widgets obrigatórios (Diferença em Epoch e 2 Restos)

– 5 widgets (diferença em anos > meses > dias > horas > minutos)

– 5 widgets (quebrando cada unidade de tempo para anos, meses, dias, horas e minutos)

2. Configurar as propriedades do seletor de data

Abra a janela de propriedades do Seletor de Data e vá para a aba de Horário. Acione o Campo de Horário selecionando SIM. Ajuste a Divisão de Minutos em 1. Então, defina o Formato de Hora em 24 horas.

3. Configure o Widget Cálculo de Formulário para Somente Leitura

Este passo é opcional mas é recomendável para impedir usuários de mudarem o valor por engano ao preencherem o formulário.

4. E vamos para a fórmula

Pegue a fórmula que você precisa para o seu formulário.

Exemplo

Data 1 = 01 Jan , 2017 às 01:05

Date 2 = 30 Jun , 2036 às 20:50

Epoch = 615239100

Fórmula para a diferença em Epoch Time:

(Data2-Data1)*86400

Multiplique a diferença por 86400 para obter o Epoch Time em segundos.

Fórmula para resto (para Anos > Meses > Dias):

(Diferença em Epoch/ 31556926-(

floor(Diferença em Epoch31556926)))*31556926

Pode parecer complicado mas tudo o que estamos fazendo aqui é obtendo o resto. O Epoch Time foi dividido por 31556926 porque é o número de segundos que existem em um ano. Então subtraímos o quociente arredondado do quociente original para obter o valor decimal. Depois, multiplicamos este decimal por 31556926 para chegar ao resto.

Fórmula para Resto (para Horas > Minutos):

(Diferença em Epoch/ 86400(

floor(Diferença em Epoch86400)))*86400

É a mesma ideia, mas dessa vez dividimos por 86400 para obter o resto de horas/minutos em um dia.

Fórmula para anos:

floor(Diferença em Epoch31556926)

Não tem segredo, é só dividir o Epoch Time por 31556926 e então arredondar para baixo o quociente.

Fórmula para meses:

floor(Resto para  A/M/D2629743)

Agora, usamos o campo Resto para A/M/D (ano, mês, dia) e dividimos por 2629743 para obter o número de meses remanescentes. 

Fórmula para dias:

floor(((Resto para A/M/D2629743)-Meses)*30.44

Isso tem que ser multiplicado por 30.44 para chegar ao número de dias remanescentes.

Fórmula para horas:

floor(Resto para HH:MM3600)

Divida o Resto para HH:MM por 3600, o número de segundos que existem em uma hora. Então arredonde o resultado para baixo.

Fórmula para minutos:

round(((Resto para HH:MM3600)-Horas)*60)

Em vez de usar floor(), dessa vez vamos usar round(). As unidades de tempo mais altas exigem o uso de floor () para deixar como resto as unidades menores de tempo. Como os minutos já são menores, você já pode simplesmente arredondar pela média. 

As próximas 5 fórmulas são opcionais para o caso de necessidade. São as unidades de tempo decompostas.

Anos:

floor(Diferença em Epoch31556926)

Meses:

floor(Diferença em Epoch2629743)

Dias:

floor(Diferença em Epoch86400)

Horas:

floor(Diferença em Epoch3600)

Minutos:

floor(Diferença em Epoch60)

Sim, pode soar confuso à primeira vista, mas assim que você pegar o jeito, principalmente a parte de obter o resto e qual unidade de conversão usar, tudo vai fazer sentido. 😊

Clone o formulário demo para obter uma compreensão melhor de como os cálculos acima funcionam.

Guia relacionado: Como clonar um formulário existente pela URL

Comentários e sugestões são bem vindos. Se tiver uma pergunta, escreva para o  Forum de Suporte que nós iremos ajudá-lo.

Este guia foi útil?

Enviar Comentário:

Jotform Avatar
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Comentar:

Podo CommentSeja o primeiro a comentar.