私が知る限り、アメリカ東部標準時はGMT-5東標準時で、GMT-4東部の夏時間です。
それでは、これら2つのコマンドが答えに異なる時間を提供するのはなぜですか?
laptop % TZ=EST5EDT date
Wed Apr 27 12:16:36 EDT 2022
laptop % TZ=GMT-4 date
Wed Apr 27 20:16:40 GMT 2022
彼らは同じでなければなりませんか?
答え1
実際、TZ変数を使用する2つの主な方法があります。以前のバージョンは POSIX 標準で指定されており、実際の変数で現在の年のタイムゾーンと夏時間ルールをエンコードします。たとえば、ヨーロッパのUTC + 2時間タイムゾーンは、次のPOSIXスタイルで完全に指定できます。
TZ=EET-2EEST,M3.5.0/3,M10.5.0/4
- EET =「標準時」タイムゾーンID(「東ヨーロッパ標準時」)
- -2 = オフセットする必要があるUTCを取得するには、現地時間を追加してください。
- EEST = DSTタイムゾーンID(「East Europe Summertime」)
- M3.5.0/3 =現地時間で3月の最後の日曜日の03:00:00にDSTが適用されます。
- M10.5.0/4 = 10月の最終日曜日、現地時間04:00:00に標準時間が再開されます。
この形式は、現在の年の夏時間規則が過去および将来の年にも適用されると仮定します。これは正確な可能性がほとんどありません。
これは明らかに理想的ではないため、多くのUNIXスタイルのオペレーティングシステムは、TZ環境変数を特定のタイムゾーンの現在および過去の定義をカバーするより拡張されたタイムゾーン情報テーブルへの参照として使用します。
これらのテーブルベースの実装の中で最も包括的なのは、Olson Time Zone Information Databaseです。IANAが管理。 OlsonスタイルのTZ値は通常<Continent>/<City>
フォーマットされていますが、データベースには他のオプションもあります。 TZ変数には2つの形式のいずれかを使用できますが、値があいまいな場合はPOSIX形式が優先されます。確立された標準。
TZ変数のPOSIX標準定義は、自然に想定するものと「反対」です。最初のタイムゾーンラベルの後の数字は、タイムゾーンに追加する必要がある時間を示します。現地時刻得るためにUTC。
これは、POSIX 標準が開発される前に、さまざまなバージョンの TZ 環境変数規則が存在していたためです。 Unixはもともと西半球で開発されたため、既存の規則では米国のタイムゾーンを表示するために正数を使用する傾向がありました。 (Unixの初期には、MULTICSオペレーティングシステム開発プロジェクトの学術派生がより大きく永続的なプロジェクトに発展するとは誰も想像できませんでした。)
私が知っている限り、POSIX仕様の開発者は、そうしないでください。
したがって、TZ=GMT-4
POSIXスタイルで説明すると、「GMTから4時間タイムゾーンを引いた」という意味ではなく、実際には「4時間タイムゾーン」を意味します。UTCより先にそして名前付き私の考えでは、必要に応じてカスタムタイムゾーンを呼び出すことができますが、まったく異なるものについてよく知られている過去のタイムゾーン識別子を再利用すると混乱を招く可能性があります。
Linuxで「GMT」だけでタイムゾーンを指定するには、プレフィックスを追加して最新のOlsonスタイルのTZ設定を使用する必要がありますEtc/
。符号規則は予想されたものとは逆です。それはおそらくPOSIXスタイルの設定の古いたとえ話を維持することです。
比較する:
$ TZ=Etc/GMT-4 date
Wed 27 Apr 21:09:32 +04 2022 # Olson: 4 hours east of UTC, timezone correctly identified numerically
$ TZ=GMT-4 date
Wed 27 Apr 21:09:50 GMT 2022 # POSIX: 4 hours east of UTC, misleading timezone identifier!
$ TZ=Etc/GMT+4 date
Wed 27 Apr 13:09:39 -04 2022 # Olson: 4 hours west of UTC, timezone correctly identified numerically
$ TZ=GMT+4 date
Wed 27 Apr 13:10:14 GMT 2022 # POSIX: 4 hours west of UTC, misleading timezone identifier!
$ date -u
Wed 27 Apr 17:10:25 UTC 2022 # UTC time for reference.