Ich habe mit date herumgespielt zu versuchen, Ausdrücke wie „2 Stunden“ in eine Anzahl von Sekunden wie 7200 umzuwandeln. Ich dachte, ich könnte dies mit Aufrufen wie:
date -d "1970-01-01 00:00:00 + 2 hours" +"%s"
Dabei bemerkte ich jedoch äußerst seltsame Ergebnisse. (Mein /etc/timezone enthält „Europa/Paris“, daher die Verwendung von TZ um UTC-Zeiten zu erzwingen.)
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
Das erste Ergebnis ist vernünftig genug, aber ich bin wirklich total verwirrt darüber, wie date vielleicht mit den drei letzten Ergebnissen kommen. Versteht jemand die Logik zwischen diesen Ergebnissen?
Akzeptierte Antwort:
Ich denke, es braucht Ihren + x als Zeitzonenangabe (z. B. 2013-04-25 19:52:36 +4). ist ein gültiger Zeitstempel in einer Zeitzone, die 4 Stunden vor UTC liegt).
Es sieht dann das Wort „Minuten“ und behandelt es als Synonym für Minute, sodass Sie eine Minute später erhalten.
Wenn Sie einen expliziten Zeitzonenbezeichner eingeben, funktioniert es:
[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
Beachten Sie die UTC nach dem Sekundenfeld. Sie können auch ein zweites +0 eingeben :
[email protected]:~$ TZ=utc date -d "1970-01-01 00:00:00 +0 + -1 minutes" +"%s"
-60
… aber zumindest persönlich ist das viel schwerer zu lesen.
Oder Sie können ein Z setzen nach den Sekunden usw. Den TZ braucht man eigentlich nicht Umgebungsvariable, die in den obigen Beispielen auf UTC gesetzt werden soll.