A matemática da data não dá o resultado esperado

A matemática da data não dá o resultado esperado

Já vi vários exemplos (incluindo estepublicar) e parece bastante simples, mas não entendi bem o que estou fazendo de errado (sei que esse post é para Linux, mas tentei com o datecomando em uma máquina Linux e obtive o mesmo resultado lá)

Um exemplo de comando e saída

me@mymachine~$ gdate -d '2019-10-19 01:37:02 +7 days' +"%Y-%m-%d %H:%M:%S"
2019-10-19 14:37:02

Eu esperava que o resultado começasse com 2019-10-26. Parece que não está analisando minha entrada, certo?

O que é ainda mais estranho (pelo menos para mim), é que se eu tirar a parte do tempo da entrada, ela funcionará conforme o esperado

me@mymachine~$ gdate -d '2019-10-19 +7 days' +"%Y-%m-%d %H:%M:%S"
2019-10-26 00:00:00

Responder1

Análise

Fiz alguns testes no Debian 9, estudei man 1 datee info date. Este último contém mais informações sobre como strings like 2019-10-19 01:37:02 +7 dayssão interpretadas.

Notas preliminares:

  • Minha resposta é usada dateporque esta é a ferramenta do Debian. (Use alias date=gdatepara testar meus comandos gdatesem editá-los todas as vezes).
  • Parece que seu fuso horário é aproximadamente equivalente a TZ=UTC+4.

Tentei replicar seu resultado:

$ date -d '2019-10-19 01:37:02 +7 days' +"%Y-%m-%d %H:%M:%S"
2019-10-19 20:37:02

Meu resultado é diferente, isso indica que os fusos horários são importantes. Para realmente replicar seu resultado:

$ TZ=UTC+4 date -d '2019-10-19 01:37:02 +7 days' +"%Y-%m-%d %H:%M:%S"
2019-10-19 14:37:02

Explicação

Acontece que +7no seu comando "mal comportado" é interpretado como UTC+7e daysé interpretado como +1 days. Comparar:

$ TZ=UTC+4 date -d '2019-10-19 01:37:02 UTC+7 +1 days' +"%Y-%m-%d %H:%M:%S"
2019-10-19 14:37:02

(Nota TZ=UTC+4significaUTC-04:00enquanto UTC+7na string significaUTC+07:00. A inconsistência com os sinais é explicadaaqui.)

O resultado misterioso não é tão misterioso agora.


peculiaridade

O que é realmente estranho é isto:

$ TZ=UTC+4 date -d '2019-10-19 01:37:02 UTC+7 days' +"%Y-%m-%d %H:%M:%S"
2019-10-25 21:37:02

Aparentemente não é UTC+7e days(ou seja, +1 dayscomo acima), mas sim UTC(significando UTC+0) e +7 days:

$ TZ=UTC+4 date -d '2019-10-19 01:37:02 UTC+0 +7 days' +"%Y-%m-%d %H:%M:%S"
2019-10-25 21:37:02

Solução

Mova a +7 dayssubstring para o início, para que apareça antes de 01:37:02. Desta forma +7não será interpretado como UTC+7:

$ date -d '2019-10-19 +7 days 01:37:02' +"%Y-%m-%d %H:%M:%S"
2019-10-26 01:37:02

Agora, 01:37:02a string de entrada é interpretada de acordo com qualquer fuso horário dateconsiderado correto. O resultado* deve ser o mesmo para mim na Europa, para outros usuários na América, na Austrália, em qualquer lugar. É por isso que larguei TZ=UTC+4, não importa mais.

*Quero dizer osequência de caracteresimpresso por datedeve ser o mesmo. Diferentes usuários interpretarão a mesma string em diferentes fusos horários e obterão momentos diferentes na realidade. Nesse sentido seus resultados são diferentes. No mesmo sentido, suas contribuições são diferentes.

informação relacionada