2013-08-19 16 views
6

我們看到.NET 4.5和System.DateTime的奇怪行爲。應用於Kind = Utc的DateTime對象時,ToLocalTime()的行爲在使用.NET 4.5的Server 2008R2計算機上與.NET 4.0相比似乎不同。更奇怪的是,這個問題並沒有在安裝了.NET 4.5的開發人員PC上顯示出來。DateTime.ToLocalTime()行爲在Server 2008R2上與.NET 4.5一起更改?

有沒有人對此行爲有過解釋?我無法打開微軟網站上的任何錯誤報告。我們可以使用更復雜的方法來轉換有效的時間,但很難確保將來沒有人使用.ToLocalTime()。

開發PC - Windows 7中,VS2012,.NET 4.5 VS2012安裝過程中安裝:

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 

除了.NET 4.5以外停產,生產服務器1和2是相同的。這個問題在全球幾個不同的當地時區運行時會出現。當以下修補程序應用於運行2008R2服務器

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 vs TimeZoneInfo.FindSystemTimeZoneById](http://stackoverflow.com/questions/14861302/timezoneinfo-local-vs-timezoneinfo-findsystemtimezonebyid) – BartoszKP

+0

什麼是GetUtcOffset返回這些情況下的每一個? http://msdn.microsoft.com/en-us/library/system.timezone.getutcoffset.aspx – EkoostikMartin

回答

2

這個問題消失:

演示該問題

示例代碼http://support.microsoft.com/kb/2863058/en-us

看來,引擎蓋下,DateTime.ToLocalTime( )使用查找技術失敗,除非該修補程序中包含的時區數據庫更新已應用。

這是非常難以追查,我還沒有看到任何其他網絡論壇提及該數據庫更新之間的鏈接和一些基本的東西utc.ToLocalTime()失敗日期在2013年8月,沒有在哪裏附近最近因美國東部的立法等而發生變化的邊界仍然想知道這種情況到底有多少地方沒有出現?

相關問題