2013-08-19 3 views
6

.NET 4.5とSystem.DateTimeで奇妙な動作が見られています。 Kind = UtcでDateTimeオブジェクトに適用されたときのToLocalTime()の動作は.NET 4.5と比較して.NET Framework 4.5のServer 2008R2マシンでは異なるようです。もっと奇妙なことに、この問題は.NET 4.5がインストールされた開発者PCには現れません。DateTime.ToLocalTime()の動作がServer 2008R2の.NET 4.5で変更されましたか?

誰でもこの動作の説明がありますか?私はマイクロソフトのサイトでバグ報告を出すことはできません。より複雑なアプローチを使用して動作する時間を変換することはできますが、将来誰も.ToLocalTime()を使用することを確実にすることは困難です。

開発PC - Windows 7の、VS2012、VS2012の間にインストールされている.NET 4.5がインストール:

unixEpoch 621355968000000000 Utc 
asLocal1 635121441023588986 Local 
asLocal2 635121441023588986 Unspecified 

プロダクションサーバー1 - サーバー2008R2、.NET 4.0

unixEpoch 621355968000000000 Utc 
asLocal1 635121441023588986 Local 
asLocal2 635121441023588986 Unspecified 

プロダクションサーバー2 - サーバー2008R2 、.NET 4.5をスタンドアロンパッケージとしてインストール

unixEpoch 621355968000000000 Utc 
asLocal1 ***635121405023588986*** Local 
asLocal2 635121441023588986 Unspecified 

ストールされたプロダクションサーバ1と2は同一です。この問題は、世界中のいくつかの異なるローカルタイムゾーンで実行されたときに現れます。問題を示し

サンプルコード:

using System; 
using NUnit.Framework; 
namespace DateTimeToLocal 
{ 
    [TestFixture] 
    public class DateTimeFixture 
    { 
     private const long unixTimeInNanos = 1376561702358898611; 

     [Test] 
     public void Demonstrate() 
     { 
     DateTime unixEpoch = new DateTime(1970, 01, 01, 0, 0, 0, DateTimeKind.Utc); 
     DateTime utc = unixEpoch.AddTicks(unixTimeInNanos/100); 

     // Method 1 - doesn't work on 2008R2 with .NET 4.5 
     DateTime asLocal1 = utc.ToLocalTime(); 

     // Method 2 - works across all .NET 4.0 and .NET 4.5 
     TimeZoneInfo localTz = TimeZoneInfo.FindSystemTimeZoneById(TimeZoneInfo.Local.StandardName); 
     DateTime asLocal2 = TimeZoneInfo.ConvertTimeFromUtc(utc, localTz); 

     Console.WriteLine("unixEpoch {0} {1}", unixEpoch.Ticks,unixEpoch.Kind); 
     Console.WriteLine("asLocal1 {0} {1}", asLocal1.Ticks, asLocal1.Kind); 
     Console.WriteLine("asLocal2 {0} {1}", asLocal2.Ticks, asLocal2.Kind); 

     Assert.AreEqual(asLocal1, asLocal2); 
     } 

     public static void Main(string[] args) 
     { 
     var t = new DateTimeFixture(); 
     t.Demonstrate(); 

     } 
    } 
} 
+1

夏時間に噛まれていますか(ローカルでは計算されていますが、未指定ではありません)? –

+0

可能な複製[TimeZoneInfo.Local対TimeZoneInfo.FindSystemTimeZoneById](http://stackoverflow.com/questions/14861302/timezoneinfo-local-vs-timezoneinfo-findsystemtimezonebyid) – BartoszKP

+0

これらのそれぞれのケースで「GetUtcOffset」は何を返しますか? http://sourceforge.net/library/system.timezone.getutcoffset.aspx – EkoostikMartin

答えて

2

次の修正プログラムが2008R2を実行しているサーバーに適用された場合、この問題が消える:http://support.microsoft.com/kb/2863058/en-us

それはボンネットの下に、DateTime.ToLocalTime(と思われます)は、その修正プログラムに含まれているタイムゾーンデータベースの更新が適用されていない限り、失敗するルックアップ手法を使用します。

これは追跡が非常に難しく、そのデータベースの更新と、utc.ToLocalTime()が2013年8月の日付で失敗したことの根本的なものとのリンクを示す他のWebフォーラムは見当たりませんでした。最近の境界は、米国東部の立法などによって変更されました。

関連する問題