現在のステータス:
.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_York
America/Toronto
"001"
注:この回答は長年にわたって進化してきたため、以下のコメントは現在のリビジョンに適用される場合と適用されない場合があります。詳細については、編集履歴を確認してください。ありがとう。