Aktualny czas w Los Angeles to 18:05. Ale kiedy biegnę TZ=UTC-8 date --iso=ns
, dostaję:
2013-12-07T10:05:37,788173835+0800
Narzędzie daty mówi mi, że jest godzina 10:05, a nawet twierdzi, że zgłasza to jako UTC + 8. Czemu?
Powodem jest to, że TZ=UTC-8
jest interpretowana jako strefa czasowa POSIX . W formacie strefy czasowej POSIX trzy litery to skrót strefy czasowej (który jest dowolny), a liczba to liczba godzin, za którymi strefa czasowa znajduje się za czasem UTC. Więc UTC-8
oznacza strefę czasową, w skrócie „UTC”, który jest -8 godziny za realną UTC, czyli UTC + 8 godzin.
(Działa to w ten sposób, ponieważ Unix został opracowany w USA, który stoi za UTC. Ten format umożliwia reprezentowanie stref czasowych w USA jako EST5, CST6 itp.)
Możesz zobaczyć, co dzieje się w tych przykładach:
$ TZ=UTC-8 date +'%Z %z'
UTC +0800
$ TZ=UTC8 date +'%Z %z'
UTC -0800
$ TZ=FOO-8 date +'%Z %z'
FOO +0800
-0800
Format strefy czasowej ISO przyjmuje odwrotne podejście, -
wskazując, że strefa znajduje się za UTC, a +
strefa wyprzedza UTC.
TZ=PST+8 date
. Dzięki. Znalazłem również to wyjaśnienie wman timezone
: „Ciąg std określa nazwę strefy czasowej i musi składać się z co najmniej trzech znaków alfabetycznych. Ciąg przesunięcia bezpośrednio następuje po std i określa wartość czasu, którą należy dodać do czasu lokalnego, aby uzyskać uniwersalny czas koordynowany ( UTC). Przesunięcie jest dodatnie, jeśli lokalna strefa czasowa znajduje się na zachód od Prime Meridian, i ujemne, jeśli jest na wschód. Godzina musi wynosić od 0 do 24, a minuty i sekundy 0 i 59. ”TZ=America/Los_Angeles
. Zapominasz, że czas pacyficzny wynosi -7 w czasie letnim.TZ=:America/Los_Angeles
. Dwukropek wskazuje, że jest to plik strefy czasowej Olsona. W innym komentarzu wspomniał, że chciałby zignorować czas letni, co by tego nie zrobiło.EST-5
CST-6
.Ilekroć określisz strefę czasową w formacie +/- 00:00, określasz przesunięcie , a nie rzeczywistą strefę czasową. Z
GNU libc
dokumentacji (zgodnej ze standardem POSIX):Dlatego wydaje się, że jest odwrotnością tego, czego oczekujesz.
źródło
Why?
Ponieważ POSIX tego wymaga .
To da czas w pobliżu [1]
Los Angeles
(z dowolną trzyliterową etykietą dla tekstu strefy czasowej):To powinno dać czas w pobliżu
Shanghai, China
lubPerth, Australia
:[1] Blisko, ponieważ może istnieć jakiś czas letni, który zmienia rzeczywisty „czas lokalny”.
źródło
Jako alternatywną metodę możesz użyć polecenia,
zdump
aby wyświetlić bieżący czas w innych strefach czasowych + przesunięcia.Te same zasady obowiązują w strefach czasowych; na zachód od głównego południka jest „z tyłu”, a na wschodzie jest „z przodu”.
Przykład
$ zdump PST PST sob. 7 grudnia 03:25:27 2013 PST
Zrobiłem ten skrypt, aby pokazać kilku stref czasowych + ofsetów jesteśmy zainteresowani w użyciu
zdump
, adate
więc możemy je porównać.Wtedy, kiedy go uruchomić można zobaczyć porównanie
zdump
dodate
:źródło