Hrál jsem si s date
pokusit se převést výrazy jako „2 hodiny“ na počet sekund, jako je 7200. Myslel jsem, že bych to mohl provést pomocí vyvolání jako:
date -d "1970-01-01 00:00:00 + 2 hours" +"%s"
Přesto jsem si při tom všiml mimořádně podivných výsledků. (Můj /etc/timezone
obsahuje „Evropa/Paříž“, proto se používá TZ
vynutit časy 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
První výsledek je dostatečně rozumný, ale jsem opravdu úplně zmatený tím, jak date
mohl přijít s posledními třemi výsledky. Rozumí někdo logice mezi těmito výsledky?
Přijatá odpověď:
Myslím, že to bere vaše + x
jako specifikátor časového pásma (např. zvažte 2013-04-25 19:52:36 +4
je platné časové razítko v časovém pásmu 4 hodiny před UTC).
Potom vidí slovo „minuty“ a považuje je za synonymum minuty, takže vám poskytne jednu minutu později.
Pokud vložíte explicitní specifikátor časového pásma, funguje to:
[email protected]:~$ TZ=utc date -d "1970-01-01 00:00:00 UTC" +"%s"
0
[email protected]:~$ TZ=utc date -d "1970-01-01 00:00:00 UTC + 0 minutes" +"%s"
0
[email protected]:~$ TZ=utc date -d "1970-01-01 00:00:00 UTC + -1 minutes" +"%s"
-60
[email protected]:~$ TZ=utc date -d "1970-01-01 00:00:00 UTC + 1 minutes" +"%s"
60
Všimněte si UTC
po sekundovém poli. Můžete také zadat druhé +0
:
[email protected]:~$ TZ=utc date -d "1970-01-01 00:00:00 +0 + -1 minutes" +"%s"
-60
…ale alespoň osobně je to mnohem těžší číst.
Nebo můžete zadat Z
po sekundách atd. TZ
ve skutečnosti nepotřebujete proměnná prostředí, která má být ve výše uvedených příkladech nastavena na UTC.