0

次の C# コード

TimeZoneInfo.FindSystemTimeZoneById("foo")

(ご想像のとおり)をスローTimeZoneNotFoundExceptionしますが、

TimeZoneInfo.FindSystemTimeZoneById("Central European Standard Time")

TimeZoneInfo中央ヨーロッパのオブジェクトを正しく返します。

これは少し偏執的な質問ですが、.NET FrameworkTimeZoneInfoは、.NET バージョンのすべてのインスタンスで同じインスタンスが使用できることを保証しますか? それらはバージョンによって異なりますか?

4

3 に答える 3

2

これは、システム自体に保存されているタイム ゾーン情報に基づいており、フレームワークの一部ではありません。FindSystemTimeZoneByIdのドキュメントから:

FindSystemTimeZoneById は、id を Windows XP および Windows Vista のレジストリの HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Time Zones ブランチのサブキー名と照合しようとします。このブランチには、必ずしもタイム ゾーン識別子の包括的なリストが含まれているわけではありません。

基本的に、Windows で既定で定義されているタイム ゾーンを使用している場合、安全なはずですが、フレームワークではなく、システム自体に基づいています。

于 2012-09-26T16:57:16.443 に答える
2

それは、CLI の実装 (.NET と Mono)、オペレーティング システムのバージョン (Windows のバージョンが異なれば履歴データのサポート範囲も異なると思います)、そしてどの更新プログラムがインストールされているかによって異なります。

これは主に、タイム ゾーン ID 自体のリストではなく、特定のタイム ゾーン ID で利用できるタイム ゾーン情報に影響しますが、それも時間の経過とともに変化する可能性があります。ただし、「中央ヨーロッパ標準時」がかなり包括的にサポートされることを期待しています。(Reed が言うように、これは .NET がサポートするものよりも、オペレーティング システムが提供するものに関するものでありTimeZoneInfo、.NET 3.5+ でのそもそもの存在を超えています。)

于 2012-09-26T16:58:15.017 に答える
1

Regedit.exe を起動し、HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zonesキーに移動します。ノードを展開すると、タイム ゾーン名のリストが表示されます。

TimeZoneInfo クラスがその情報を取得する場所があります。

いいえ、情報がそこにあることを保証するために .NET ができることは何もありません。レジストリ キーは Windows が所有しています。しかし、これで、トラブルの原因となったマシンのトラブルシューティング方法がわかりました。非常にまれですが、せいぜいマシンが Window Update の更新を受けていないため、これらのキーも更新されていません。夏時間ルールの変更が最も頻繁に行われます。レジストリの破損は常に可能です。

于 2012-09-26T17:00:25.053 に答える