[解決済み] WindowsとIANAのタイムゾーンを変換する方法は?
質問
で説明したように タイムゾーンタグ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_York
と
America/Toronto
. TimeZoneConverter は CLDR がマークしたものを
"001"
ただし、国番号を指定して、その国の別のゾーンに一致するものがある場合は、この限りではありません。
注:この回答は長年にわたって進化してきたため、以下のコメントは現在のリビジョンに適用される場合とされない場合があります。 詳細については、編集履歴をご覧ください。 ありがとうございます。
関連
-
[解決済み】「未割り当てのローカル変数を使用」とはどういう意味ですか?
-
[解決済み】スクリプトクラスが見つからないので、スクリプトコンポーネントを追加できない?
-
[解決済み】ORA-01008: すべての変数がバインドされていません。これらはバインドされています。
-
[解決済み】Moqを使用してメソッド呼び出しを検証する
-
[解決済み】IntPtrとは一体何なのか?
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] .NETでのdecimal, float, doubleの違い?
-
[解決済み] Microsoft Officeをインストールせずに、C#でExcel(.XLSおよび.XLSX)ファイルを作成するにはどうすればよいですか?
-
[解決済み] C#のconstとreadonlyの違いは何ですか?
-
[解決済み] async」と「await」の使い方とタイミング
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Ajax処理で「無効なJSONプリミティブ」と表示される件
-
[解決済み】WebForms UnobtrusiveValidationModeは、jqueryのScriptResourceMappingを必要とする
-
[解決済み】C# ASP.NET使用時に「WebClientのリクエスト中に例外が発生しました。
-
[解決済み】C# - パスに不正な文字がある場合
-
[解決済み】Socket.Selectがエラー "An operation was attempted on something that is not a socket" を返す。
-
[解決済み】「...は'型'であり、与えられたコンテキストでは有効ではありません」を解決するにはどうすればよいですか?(C#)
-
[解決済み】Visual Studio: 操作を完了できませんでした。パラメータが正しくありません
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。
-
[解決済み】ファイルやアセンブリ、またはその依存関係の1つをロードできませんでした。
-
[解決済み】別のスレッドがこのオブジェクトを所有しているため、呼び出し側のスレッドはこのオブジェクトにアクセスできない