2013-08-19 18 views
6

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(); 

     } 
    } 
} 
+1

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)? –

+0

có thể trùng lặp của [TimeZoneInfo.Local vs TimeZoneInfo.FindSystemTimeZoneById] (http://stackoverflow.com/questions/14861302/timezoneinfo-local-vs-timezoneinfo-findsystemtimezonebyid) – BartoszKP

+0

'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

Trả lời

2

Vấn đề này sẽ biến mất khi các hotfix sau đây được áp dụng cho các máy chủ chạy 2008R2: http://support.microsoft.com/kb/2863058/en-us

Dường như dưới mui xe, DateTime.ToLocalTime () sử dụng một kỹ thuật tra cứu không thành công trừ khi cập nhật cơ sở dữ liệu múi giờ chứa trong hotfix đó đã được áp dụng.

Điều này cực kỳ khó để theo dõi và tôi không thấy BẤT CỨ diễn đàn web nào khác đề cập đến liên kết giữa cập nhật cơ sở dữ liệu và nội dung cơ bản như utc.ToLocalTime() không thành công vào tháng 8 năm 2013 ranh giới gần đây đã thay đổi do pháp luật, vv ở miền Đông Hoa Kỳ. Tuy nhiên, tự hỏi chính xác điều này không được nhìn thấy nhiều nơi hơn thế nào?