6

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

誰かがこの動作について説明していますか? Microsoft サイトでバグ レポートを表示できません。より複雑な方法で時間を変換することもできますが、今後誰も .ToLocalTime() を使用しないようにすることは困難です。

開発者用 PC - VS2012 のインストール中にインストールされた Windows 7、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

Production Server 2 - Server 2008R2、スタンドアロン パッケージとしてインストールされた .NET 4.5

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

.NET 4.5 がインストールされていることを除けば、運用サーバー 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();

      }
   }
}
4

1 に答える 1

2

この問題は、2008R2 を実行しているサーバーに次のホットフィックスを適用すると解消されます: http://support.microsoft.com/kb/2863058/en-us

内部では、DateTime.ToLocalTime() は、そのホットフィックスに含まれるタイムゾーン データベースの更新が適用されていない限り失敗するルックアップ手法を使用しているようです。

これを追跡するのは非常に困難であり、そのデータベースの更新と utc.ToLocalTime() のような基本的なものとの間のリンクが 2013 年 8 月の日付で失敗したことについて言及している他の Web フォーラムを見たことがありません。米国東部の法律などにより、これがより多くの場所で見られないのはどうしてなのか、まだ疑問に思っていますか?

于 2013-08-27T16:21:53.903 に答える