我們看到.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();
}
}
}
您是否因夏令時(以本地計算,但未計算未指定)計算被咬傷? –
可能重複[TimeZoneInfo.Local vs TimeZoneInfo.FindSystemTimeZoneById](http://stackoverflow.com/questions/14861302/timezoneinfo-local-vs-timezoneinfo-findsystemtimezonebyid) – BartoszKP
什麼是GetUtcOffset返回這些情況下的每一個? http://msdn.microsoft.com/en-us/library/system.timezone.getutcoffset.aspx – EkoostikMartin