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?
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?
Antworten:
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=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):
Der Versatz gibt den Zeitwert an, den Sie zur Ortszeit hinzufügen müssen, um einen koordinierten Weltzeitwert zu erhalten. Es hat eine Syntax wie [+ | -] hh [: mm [: ss]]. Dies ist positiv, wenn die lokale Zeitzone westlich des Nullmeridians liegt, und negativ, wenn sie östlich liegt. Die Stunde muss zwischen 0 und 23 und die Minute und die Sekunde zwischen 0 und 59 liegen.
Deshalb scheint es das Gegenteil von dem zu sein, was Sie erwarten.
Why?
Weil POSIX es erfordert .
Wenn ein '-' vorangestellt ist, befindet sich die Zeitzone östlich des Nullmeridians. Andernfalls handelt es sich um "West" (was durch ein optionales vorangestelltes "+" angegeben werden kann).
Dies ergibt also eine Zeit in der Nähe von [1] Los Angeles
(mit einer 3-Buchstaben-Bezeichnung für Zeitzonentext):
$ TZ=ANY8 date "+%Y-%m-%d %H:%M:%S %Z%z"
2016-04-23 10:47:12 ANY-0800
$ TZ=GMT+8 date "+%Y-%m-%d %H:%M:%S %Z%z"
2016-04-23 10:47:12 GMT-0800
Und dies sollte die Zeit in der Nähe von Shanghai, China
oder geben Perth, Australia
:
$ TZ=ANY-8 date "+%Y-%m-%d %H:%M:%S %Z%z"
2016-04-24 02:47:12 ANY+0800
$ TZ=CST-8 date "+%Y-%m-%d %H:%M:%S %Z%z"
2016-04-23 02:47:12 CST+0800
[1] In der Nähe, da möglicherweise eine bestimmte Sommerzeit (DST) aktiv ist, die die tatsächliche "Ortszeit" verschiebt.
Alternativ können Sie den Befehl verwenden zdump
, um die aktuelle Zeit in anderen Zeitzonen + Offsets anzuzeigen.
Zdump gibt die aktuelle Zeit in jedem Zonennamen aus, der in der Befehlszeile angegeben ist.
Die gleichen Regeln gelten für die Zeitzonen. westlich des Nullmeridians "hinter", im Osten "vor".
$ 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
und date
um sie zu vergleichen.
$ cat cmd.bash
#!/bin/bash
printf "\ndate: %s\n\n" "$(date)"
for tz in EST PST PST+8 PST-8 UTC UTC+8 UTC-8; do
echo "-- timezone $tz"
printf "zdump: %s\n" "$(zdump $tz)"
printf "date: %s\n" "$(TZ=$tz date +'%a %b %d %T %Y - (%Z %z)')"
echo ""
done
Wenn Sie es dann ausführen, können Sie den Vergleich von zdump
zu sehen date
:
$ ./cmd.bash
date: Sat Dec 7 02:59:05 EST 2013
-- timezone EST
zdump: EST Sat Dec 7 02:59:05 2013 EST
date: Sat Dec 07 02:59:05 2013 - (EST -0500)
-- timezone PST
zdump: PST Sat Dec 7 07:59:05 2013 PST
date: Sat Dec 07 07:59:05 2013 - (PST +0000)
-- timezone PST+8
zdump: PST+8 Fri Dec 6 23:59:05 2013 PST
date: Fri Dec 06 23:59:05 2013 - (PST -0800)
-- timezone PST-8
zdump: PST-8 Sat Dec 7 15:59:05 2013 PST
date: Sat Dec 07 15:59:05 2013 - (PST +0800)
-- timezone UTC
zdump: UTC Sat Dec 7 07:59:05 2013 UTC
date: Sat Dec 07 07:59:05 2013 - (UTC +0000)
-- timezone UTC+8
zdump: UTC+8 Fri Dec 6 23:59:05 2013 UTC
date: Fri Dec 06 23:59:05 2013 - (UTC -0800)
-- timezone UTC-8
zdump: UTC-8 Sat Dec 7 15:59:05 2013 UTC
date: Sat Dec 07 15:59:05 2013 - (UTC +0800)
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. "