Warum erzeugt TZ = UTC-8 Datumsangaben, die UTC + 8 sind?

25

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?

Alex Henrie
quelle

Antworten:

33

Der Grund ist, dass TZ=UTC-8als 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-8also 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- -0800Zeitzonenformat verwendet den umgekehrten Ansatz: Es gibt an, -dass die Zone hinter UTC und +die Zone vor UTC liegt.

cjm
quelle
Ach so, was ich wirklich wollte, war TZ=PST+8 date. Vielen Dank. Ich fand diese Erklärung auch unter man 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. "
Alex Henrie
3
@Alex nein, was du wirklich willst ist TZ=America/Los_Angeles. Sie vergessen, dass die pazifische Zeit während der Sommerzeit -7 ist.
Matt Johnson-Pint
3
@MattJohnson, du meinst 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.
cjm
@cjm, danke, du hast recht mit dem Doppelpunkt und ich hatte diesen Kommentar nicht gesehen.
Matt Johnson-Pint
Amerika, für die Welt, wenn es bedeutet, dass wir es müssen EST-5 CST-6.
Evan Carroll
7

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.

Jordanien
quelle
2

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, Chinaoder 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.


quelle
1

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".

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, zdumpund dateum 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 zdumpzu 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)
slm
quelle
Ich versuche tatsächlich, die aktuelle Zeit in Pacific Standard Time zu ermitteln, wobei ich die Sommerzeit ignoriere.
Alex Henrie
1
Ich musste dieses Video ablehnen, weil Sie vermuten, dass "UTC-8" falsch ist. Es ist richtig, es tut einfach nicht das, was der Benutzer erwartet. Ich habe nicht das Gefühl, dass es die Frage beantwortet, warum es so funktioniert.
Jordanien
@jordanm - siehe aufräumen.
slm
1
Es erklärt immer noch, was passiert, aber nicht, warum und "warum", was OP fragt. Ich werde meine Ablehnung entfernen, aber ich habe immer noch nicht das Gefühl, dass dies eine gute Antwort auf die Frage ist.
Jordanien