Eu estava brincando para date
tentar converter expressões como "2 horas" em um número de segundos como 7200. Achei que poderia fazer isso com invocações como:
date -d "1970-01-01 00:00:00 + 2 hours" +"%s"
No entanto, notei resultados extremamente estranhos ao fazê-lo. (My /etc/timezone
contém "Europa/Paris", daí o uso de TZ
para forçar os horários UTC.)
omega:~$ TZ=utc date -d "1970-01-01 00:00:00" +"%s"
0
omega:~$ TZ=utc date -d "1970-01-01 00:00:00 + 0 minutes" +"%s"
60
omega:~$ TZ=utc date -d "1970-01-01 00:00:00 + -1 minutes" +"%s"
3660
omega:~$ TZ=utc date -d "1970-01-01 00:00:00 + 1 minutes" +"%s"
-3540
O primeiro resultado é bastante razoável, mas estou totalmente confuso sobre como date
poderia ter chegado aos três últimos resultados. Alguém entende a lógica entre esses resultados?
Responder1
Acho que está considerando + x
o seu especificador de fuso horário (por exemplo, considere 2013-04-25 19:52:36 +4
um carimbo de data / hora válido, em um fuso horário 4 horas antes do UTC).
É então ver a palavra 'minutos' e tratá-la como sinônimo de minuto, dando-lhe um minuto depois.
Se você inserir um especificador de fuso horário explícito, funcionará:
anthony@Zia:~$ TZ=utc date -d "1970-01-01 00:00:00 UTC" +"%s"
0
anthony@Zia:~$ TZ=utc date -d "1970-01-01 00:00:00 UTC + 0 minutes" +"%s"
0
anthony@Zia:~$ TZ=utc date -d "1970-01-01 00:00:00 UTC + -1 minutes" +"%s"
-60
anthony@Zia:~$ TZ=utc date -d "1970-01-01 00:00:00 UTC + 1 minutes" +"%s"
60
Observe o UTC
campo após os segundos. Você também pode colocar um segundo +0
:
anthony@Zia:~$ TZ=utc date -d "1970-01-01 00:00:00 +0 + -1 minutes" +"%s"
-60
... mas pelo menos pessoalmente, isso é muito mais difícil de ler.
Ou você pode colocar um Z
após os segundos, etc. Na verdade, você não precisa que a TZ
variável de ambiente seja definida como UTC nos exemplos acima.