Die aktuelle Zeit in Los Angeles ist 18:05. Aber wenn ich renne TZ=UTC-8 date --iso=ns
, bekomme ich:
2013-12-07T10:05:37,788173835+0800
Das Dienstprogramm date gibt an, dass die Uhrzeit 10:05 Uhr ist, und meldet sie sogar als UTC + 8. Warum?
Der Grund ist, dass TZ=UTC-8
als POSIX-Zeitzone interpretiert wird . Im POSIX-Zeitzonenformat sind die 3 Buchstaben die Abkürzung für die Zeitzone (die willkürlich ist) und die Zahl die Anzahl der Stunden, die die Zeitzone hinter UTC liegt. Bedeutet UTC-8
also eine Zeitzone mit der Abkürzung "UTC", die –8 Stunden hinter der tatsächlichen UTC oder UTC + 8 Stunden liegt.
(Das funktioniert so, weil Unix in den USA entwickelt wurde, was hinter UTC liegt. Mit diesem Format können die US-Zeitzonen als EST5, CST6 usw. dargestellt werden.)
Sie können anhand der folgenden Beispiele sehen, was genau passiert:
$ TZ=UTC-8 date +'%Z %z'
UTC +0800
$ TZ=UTC8 date +'%Z %z'
UTC -0800
$ TZ=FOO-8 date +'%Z %z'
FOO +0800
Das ISO- -0800
Zeitzonenformat verwendet den umgekehrten Ansatz: Es gibt an, -
dass die Zone hinter UTC und +
die Zone vor UTC liegt.
TZ=PST+8 date
. Vielen Dank. Ich fand diese Erklärung auch unterman timezone
: "Die Standardzeichenfolge gibt den Namen der Zeitzone an und muss aus drei oder mehr alphabetischen Zeichen bestehen. Die Versatzzeichenfolge folgt unmittelbar auf std und gibt den Zeitwert an, der zur Ortszeit hinzugefügt werden soll, um die koordinierte Weltzeit zu erhalten. ( UTC). Der Versatz ist positiv, wenn sich die lokale Zeitzone westlich des Nullmeridians befindet, und negativ, wenn sich die Zeitzone östlich befindet. Die Stunde muss zwischen 0 und 24 und die Minuten und Sekunden zwischen 0 und 59 liegen. "TZ=America/Los_Angeles
. Sie vergessen, dass die pazifische Zeit während der Sommerzeit -7 ist.TZ=:America/Los_Angeles
. Der Doppelpunkt zeigt an, dass es sich um eine Olson-Zeitzonendatei handelt. Und in einem anderen Kommentar erwähnte er, dass er die Sommerzeit ignorieren wollte, was das nicht tun würde.EST-5
CST-6
.Wann immer Sie eine Zeitzone im Format +/- 00:00 angeben, geben Sie einen Versatz an , nicht die tatsächliche Zeitzone. Aus der
GNU libc
Dokumentation (die dem POSIX-Standard folgt):Deshalb scheint es das Gegenteil von dem zu sein, was Sie erwarten.
quelle
Why?
Weil POSIX es erfordert .
Dies ergibt also eine Zeit in der Nähe von [1]
Los Angeles
(mit einer 3-Buchstaben-Bezeichnung für Zeitzonentext):Und dies sollte die Zeit in der Nähe von
Shanghai, China
oder gebenPerth, Australia
:[1] In der Nähe, da möglicherweise eine bestimmte Sommerzeit (DST) aktiv ist, die die tatsächliche "Ortszeit" verschiebt.
quelle
Alternativ können Sie den Befehl verwenden
zdump
, um die aktuelle Zeit in anderen Zeitzonen + Offsets anzuzeigen.Die gleichen Regeln gelten für die Zeitzonen. westlich des Nullmeridians "hinter", im Osten "vor".
Beispiel
$ zdump PST PST Sa Dez 7 03:25:27 2013 PST
Ich habe dieses Skript erstellt, um einige der Zeitzonen + Offsets anzuzeigen, die wir verwenden möchten,
zdump
unddate
um sie zu vergleichen.Wenn Sie es dann ausführen, können Sie den Vergleich von
zdump
zu sehendate
:quelle