失われたモスクワ時間の物語、またはMicrosoft Guysが間違えたもの





先日、Windowsオペレーティングシステムファミリにモスクワ時間に関する誤った情報が含まれていることを残念に発見しました。 2011年にシステムにリークしたものの、エラーがまだ修正されていないことは注目に値します。 エラーの結果は.NETを使用して表示されますが、これはタイムゾーンとタイムオフセットでWindowsデータを信頼するすべてのテクノロジに当てはまります。



だから、私の車ではモスクワのタイムゾーンが設定されています:





UTCで日付09.03.2014 10:00を作成します。 次に、それをモスクワ時間に変換します。 ご存知のように、現在モスクワでは、 UTC + 04:00オフセットが一年中稼働しています。



var dt = new DateTime(2014, 3, 9, 10, 0, 0, DateTimeKind.Utc); //09.03.2014 10:00 UTC Console.WriteLine("UTC: {0},\nMoscow: {1}",dt, dt.ToLocalTime() );
      
      





取得するもの:

UTC:2014年3月9日10:00:00、

モスクワ:2014年3月9日14:00:00


まあ、悪くない。 ただし、過去をもう少し深く掘り下げます。 冬時間のための時計のキャンセルの前に、私たちの国は年に2回時計の針を翻訳しました。 冬には、モスクワ時間はUTC + 03:00に、夏にはUTC + 04:00にシフトしました。

UTCの09.03.2010 10:00の日付に対して操作を繰り返します。



 var dt = new DateTime(2010, 3, 9, 10, 0, 0, DateTimeKind.Utc); //09.03.2010 10:00 UTC Console.WriteLine("UTC: {0},\nMoscow: {1}",dt, dt.ToLocalTime() );
      
      





取得するもの:

UTC:2010年3月9日10:00:00、

モスクワ:2010年3月9日14:00:00


何かが間違っています。 2010年3月には冬時間が有効になりました。そのため、オフセットは+04:00ではなく+03:00時間である必要があります。 同様に、夏時間(2010年6月)の場合:



 var dt = new DateTime(2010, 6, 9, 10, 0, 0, DateTimeKind.Utc); //09.06.2010 10:00 UTC Console.WriteLine("UTC: {0},\nMoscow: {1}",dt, dt.ToLocalTime() );
      
      





UTC:2010年6月9日10:00:00、

モスクワ:2010年6月9日15:00:00


夏には、オフセットは+04:00でしたが、オフセット+05:00を取得しました。これはモスクワのタイムゾーンには決してありませんでした!



問題は何ですか?



タイムゾーン情報はWindowsレジストリに保存され、パッチで更新されます。 グローバルタイムゾーン情報を更新する(および* nixシステム、BSDシステム、およびMac OS Xで使用される) tzデータベースを使用する代わりに、Microsoftは独自のデータベースを保持しています。



少し簡略化するために、その中の情報はこのように保存されます。 タイムゾーンの場合、UTCに対するベースオフセットが示され、夏時間/冬時間への移行に関する情報があります。 遷移がいつ行われ、ベースオフセットがどのように変化するかについて説明します。 冬時間への切り替えがキャンセルされる前は、モスクワでは次の数値が有効でした。



冬時間へ切り替えをキャンセルすると、モスクワの年間シフトUTC + 04:00を修正するはずのホットフィックスました。 しかし、エラーがありました。 恒久的な夏時間を設定する代わりに、Microsoftはベースオフセットを+03:00から+04:00に変更し、恒久的な冬時間をオンにしました。 ただし、実際には、Microsoftタイムゾーンデータベースには、ベースオフセットの変更に関する履歴情報が含まれていません。 その結果、2010年夏以前の日付については、次の状況が得られます。 冬時間が有効な場合、そのシフトはベースと一致します。 パッチがリリースされる前は+03:00でしたが、現在は+04:00になっています。 夏時間が有効な場合、ベースに対して+01:00のオフセットがあります。 以前は+04:00でしたが、パッチのリリース後は+05:00になりました。



しばらくして、この問題に気付き 、Microsoftは現在の状況を修正することになっている別のホットフィックスを準備しました。 ただし、インストールしても問題は解決しません。



現時点では、Windows 7、Windows 8、およびWindows Server 2008 R2でエラーが再現されることが実験的にわかっています。 .NETの場合、この問題は、tzデータベースを使用するNodaTimeライブラリを使用して日付を操作することで解決できます。



All Articles