1. ホーム
  2. c#

[解決済み] WindowsとIANAのタイムゾーンを変換する方法は?

2022-04-20 10:59:08

質問

で説明したように タイムゾーンタグwiki タイムゾーンには2種類のスタイルがあります。

  • マイクロソフトがWindowsと.Netで使用するために提供するもの。 TimeZoneInfo クラスは、(Windows上で実行する場合)次のような値で識別されます。 "Eastern Standard Time" .

  • IANAがTZDBで提供し、.NETで使用されるもの TimeZoneInfo クラスは、Linux や OSX で実行される場合、次のような値で識別されます。 "America/New_York" .

多くのインターネットベースのAPIはIANAタイムゾーンを使用していますが、多くの理由により、これをWindowsのタイムゾーンIDに変換する、またはその逆に変換する必要があるかもしれません。

.Netでこれを実現するにはどうしたらよいでしょうか?

どのように解決するのですか?

WindowsとIANAのタイムゾーン識別子を変換するためのデータの主な供給元は windowsZones.xml の一部として配布されているファイルです。 ユニコードCLDR プロジェクトに参加しています。 最新の開発版は、以下の場所にあります。 こちら .

しかし CLDRは年に2回しかリリースされません。 このため、Windowsの定期的なアップデートや、IANAのタイムゾーン・データベースの不定期な更新と合わせて、CLDRのデータをそのまま使用するのは複雑なのです。 また、タイムゾーンの変更自体、世界各国の政府の気まぐれで行われるものであり、すべての変更が発効日までにリリースサイクルに間に合うよう、十分な予告をもって行われるとは限らないことも覚えておいてください。

CLDRが厳密にカバーしていないエッジケースを処理する必要があるものが他にもいくつかあり、新しいものが時々出てきます。 そのため、複雑な解決策をカプセル化して タイムゾーンコンバーター マイクロライブラリは、Nugetからインストールすることができます。

このライブラリの使い方は簡単です。 以下は変換の例です。

string tz = TZConvert.IanaToWindows("America/New_York");
// Result:  "Eastern Standard Time"

string tz = TZConvert.WindowsToIana("Eastern Standard Time");
// result:  "America/New_York"

string tz = TZConvert.WindowsToIana("Eastern Standard Time", "CA");
// result:  "America/Toronto"

他の例もあります プロジェクトサイトにて .

IANAタイムゾーンは1つのWindowsタイムゾーンにマッピングできますが、その逆は真ではないことを認識することが重要です。 1つのWindowsタイムゾーンは、複数のIANAタイムゾーンにマッピングされるかもしれません。 これは、上記の例で見ることができる。 Eastern Standard Time の両方にマッピングされます。 America/New_YorkAmerica/Toronto . TimeZoneConverter は CLDR がマークしたものを "001" ただし、国番号を指定して、その国の別のゾーンに一致するものがある場合は、この限りではありません。

注:この回答は長年にわたって進化してきたため、以下のコメントは現在のリビジョンに適用される場合とされない場合があります。 詳細については、編集履歴をご覧ください。 ありがとうございます。