
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 date
comando 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 date
e info date
. Este último contém mais informações sobre como strings like 2019-10-19 01:37:02 +7 days
são interpretadas.
Notas preliminares:
- Minha resposta é usada
date
porque esta é a ferramenta do Debian. (Usealias date=gdate
para testar meus comandosgdate
sem 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 +7
no seu comando "mal comportado" é interpretado como UTC+7
e 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+4
significaUTC-04:00enquanto UTC+7
na 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+7
e days
(ou seja, +1 days
como 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 days
substring para o início, para que apareça antes de 01:37:02
. Desta forma +7
nã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:02
a string de entrada é interpretada de acordo com qualquer fuso horário date
considerado 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 date
deve 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.