Chúng tôi đang nhìn thấy hành vi kỳ quái với .NET 4.5 và System.DateTime. Hành vi của ToLocalTime() khi được áp dụng cho các đối tượng DateTime với Kind = Utc có vẻ khác trên các máy chủ Server 2008R2 với .NET 4.5 so với .NET 4.0. Thậm chí kỳ lạ hơn, vấn đề không thể hiện trên máy tính của nhà phát triển có cài đặt .NET 4.5.Thay đổi hành vi DateTime.ToLocalTime() với .NET 4.5 trên Server 2008R2?
Có ai có giải thích về hành vi này không? Tôi không thể bật bất kỳ báo cáo lỗi nào trên các trang web của Microsoft. Chúng tôi có thể sử dụng một cách tiếp cận phức tạp hơn để chuyển đổi thời gian hoạt động, nhưng thật khó để đảm bảo không ai sử dụng .ToLocalTime() trong tương lai.
Developer PC - Windows 7, VS2012, .NET 4.5 được cài đặt trong VS2012 cài đặt:
unixEpoch 621355968000000000 Utc
asLocal1 635121441023588986 Local
asLocal2 635121441023588986 Unspecified
Production Server 1 - Server 2008R2, .NET 4.0
unixEpoch 621355968000000000 Utc
asLocal1 635121441023588986 Local
asLocal2 635121441023588986 Unspecified
Production Server 2 - Server 2008R2 , .NET 4.5 được cài đặt dưới dạng gói độc lập
unixEpoch 621355968000000000 Utc
asLocal1 ***635121405023588986*** Local
asLocal2 635121441023588986 Unspecified
Khác với .NET 4.5 in bị đình trệ, máy chủ sản xuất 1 và 2 giống hệt nhau. Sự cố hiển thị khi chạy trong một số múi giờ địa phương khác nhau trên toàn cầu.
Mẫu mã đó chứng tỏ vấn đề:
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();
}
}
}
Bạn có bị cắn bởi thời gian tiết kiệm ánh sáng ban ngày (được tính cho Địa phương nhưng không được tính cho Không xác định)? –
có thể trùng lặp của [TimeZoneInfo.Local vs TimeZoneInfo.FindSystemTimeZoneById] (http://stackoverflow.com/questions/14861302/timezoneinfo-local-vs-timezoneinfo-findsystemtimezonebyid) – BartoszKP
'GetUtcOffset' trả về cho từng trường hợp này là gì? http://msdn.microsoft.com/en-us/library/system.timezone.getutcoffset.aspx – EkoostikMartin