181

timezone tag wikiで説明されているように、タイム ゾーンには 2 つの異なるスタイルがあります。

  • Windows および .NetTimeZoneInfoクラス (Windows で実行する場合) で使用するために Microsoft によって提供されるものは、 などの値で識別され"Eastern Standard Time"ます。

  • TZDB で IANA によって提供され、TimeZoneInfoLinux または OSX での実行時に .NET クラスによって使用されるものは、 などの値によって識別され"America/New_York"ます。

多くのインターネット ベースの API は IANA タイム ゾーンを使用しますが、さまざまな理由から、これを Windows タイム ゾーン ID (またはその逆) に変換する必要がある場合があります。

これを .Net でどのように実現できますか?

4

3 に答える 3

244

現在のステータス:

.NET 6 以降、両方の形式のタイム ゾーンが、タイム ゾーン データと ICU の両方がインストールされているすべてのプラットフォーム (Windows、Linux、および MacOS のほとんどのインストール) でサポートされます。Tobias の回答を参照してください。

元の回答:

Windows と IANA のタイム ゾーン識別子間の変換のためのデータの主なソースは、Unicode CLDRプロジェクトのwindowsZones.xml一部として配布されるファイルです。最新の開発バージョンはここにあります。

ただし、CLDR は年に 2 回しかリリースされません。これに加えて、定期的な Windows 更新と、IANA タイム ゾーン データベースの不定期更新により、CLDR データを直接使用することが複雑になります。タイム ゾーンの変更自体は、世界のさまざまな政府の気まぐれで行われることに注意してください。すべての変更が、それぞれの発効日より前にこれらのリリース サイクルに組み込むために十分な通知を行って行われるわけではありません。

CLDR で厳密にカバーされていない、対処する必要がある他のいくつかのエッジ ケースがあり、新しいケースが時々発生します。したがって、ソリューションの複雑さを、Nuget からインストールできるTimeZoneConverterマイクロ ライブラリにカプセル化しました。

このライブラリの使用は簡単です。変換の例を次に示します。

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 タイム ゾーンは単一の Windows タイム ゾーンにマップできますが、その逆は当てはまらないことを認識することが重要です。1 つの Windows タイム ゾーンが、複数の IANA タイム ゾーンにマップされる場合があります。これは、上記の例で見ることができます。ここで、は と の両方にEastern Standard Timeマップされます。TimeZoneConverter は、具体的に国コードを指定し、その国の別のゾーンに一致するものがない限り、「ゴールデン ゾーン」として知られるCLDR がマークするものを配信します。America/New_YorkAmerica/Toronto"001"

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

于 2013-06-27T16:46:46.123 に答える