Como a data do coreutil consegue obter resultados tão estranhos?

4

Eu estava brincando com date para tentar converter expressões como "2 hours" para um número de segundos como 7200. Eu pensei em 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. (Meu /etc/timezone contém "Europa / Paris", portanto, o uso de TZ para forçar os tempos 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 é razoável o suficiente, mas estou realmente intrigado sobre como date pode ter chegado aos três últimos resultados. Alguém entende a lógica entre esses resultados?

    
por a3nm 25.04.2013 / 16:51

1 resposta

11

Acho que está tirando seu + x como um especificador de fuso horário (por exemplo, considere 2013-04-25 19:52:36 +4 é um carimbo de data e hora válido em um fuso horário quatro horas à frente de 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, ele 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 campo UTC após o segundo. 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, é 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 variável de ambiente TZ seja definida como UTC nos exemplos acima.

    
por 25.04.2013 / 17:58