2011-02-10 64 views
5

Các tài liệu cho các tiểu bang phương pháp NET DateTime.ToLocalTime:DateTime.ToLocalTime trên Windows XP

Trên các hệ thống Windows XP, ToLocalTime phương pháp ghi nhận chỉ có hiện tại quy tắc điều chỉnh khi chuyển đổi từ UTC thành giờ cục bộ. Kết quả là, chuyển đổi cho các khoảng thời gian trước khi quy tắc điều chỉnh hiện tại được đưa vào hiệu ứng có thể không phản ánh chính xác sự khác biệt giữa UTC và giờ địa phương.

Tôi đang phát triển trên Windows 7 nhưng triển khai vào môi trường hỗn hợp. Làm thế nào tôi có thể cung cấp một thực hiện phù hợp, chính xác phù hợp với hành vi Windows 7 của ToLocalTime?

EDIT

Tôi chạy một thử nghiệm:

static void Main() 
{ 
    // 8 AM in July, UTC. That would have been DST, so 3 AM CDT. 
    var dstDate = new DateTime(2010, 7, 1, 8, 0, 0, DateTimeKind.Utc); 

    // 8 AM in December, UTC. Not DST, so 2 AM CST. 
    var nonDstDate = new DateTime(2010, 12, 1, 8, 0, 0, DateTimeKind.Utc); 

    Log("DST Date ToLocalTime: " + dstDate.ToLocalTime()); 
    Log("DST Date ConvertTimeFromUtc: " + ConvertTimeFromUtc(dstDate)); 
    Log("Expected: 3 AM July 1 2010"); 

    Log(string.Empty); 

    Log("Non-DST Date ToLocalTime: " + nonDstDate.ToLocalTime()); 
    Log("Non-DST Date ConvertTimeFromUtc: " + ConvertTimeFromUtc(nonDstDate)); 
    Log("Expected: 2 AM December 1 2010"); 

    Log(string.Empty); 

    Log("Date ToLocalTime Kind: " + dstDate.ToLocalTime().Kind); 
    Log("Date ConvertTimeFromUtc Kind: " + ConvertTimeFromUtc(dstDate).Kind); 
} 

private static void Log(string message) 
{ 
    Console.WriteLine(message); 
} 

private static DateTime ConvertTimeFromUtc(DateTime utcDateTime) 
{ 
    return 
     DateTime.SpecifyKind(
      TimeZoneInfo.ConvertTimeFromUtc(
       utcDateTime, 
       TimeZoneInfo.FindSystemTimeZoneById(TimeZoneInfo.Local.Id)), 
      DateTimeKind.Local); 
} 

Kết quả thật giống hệt dưới XP Pro 32-bit, SP3 (như VM) và Windows 7 Enterprise 64-bit:

DST Date ToLocalTime: 7/1/2010 3:00:00 AM 
DST Date ConvertTimeFromUtc: 7/1/2010 3:00:00 AM 
Expected: 3 AM July 1 2010 

Non-DST Date ToLocalTime: 12/1/2010 2:00:00 AM 
Non-DST Date ConvertTimeFromUtc: 12/1/2010 2:00:00 AM 
Expected: 2 AM December 1 2010 

Date ToLocalTime Kind: Local 
Date ConvertTimeFromUtc Kind: Local

Tài liệu có sai không? Tôi có thể gọi ToLocalTime đơn giản không?

EDIT 2

Chúng tôi chạy trên một hệ thống XP thực tế (không phải là một máy ảo) và nhận được kết quả giống hệt nhau đó là tốt. Các trường hợp thử nghiệm của tôi có đúng không? Bất cứ ai có thể cung cấp một trường hợp mà kết quả sẽ khác nhau?

Trả lời

5

Trên các hệ thống Windows XP, phương pháp ToLocalTime nhận chỉ hiện điều chỉnh quy tắc khi chuyển đổi từ UTC thành giờ cục bộ. Kết quả là, chuyển đổi cho các khoảng thời gian trước khi quy tắc điều chỉnh hiện tại được đưa vào hiệu ứng có thể không phản ánh chính xác sự khác biệt giữa UTC và giờ địa phương.

Mỹ đã thay đổi quy tắc điều chỉnh cho DST năm 2007.

  • 2006: Bắt đầu 1 chủ nhật trong tháng Tư, End chủ nhật tuần trước trong tháng Mười.
  • 2007: Bắt đầu vào Chủ Nhật thứ 2 vào tháng 3, kết thúc vào Chủ Nhật đầu tiên trong tháng 11.

Lỗi là họ tuân theo quy tắc 2007 cho tất cả các ngày, không chỉ ngày sau năm 2007. Quy tắc DST đã không thay đổi trong 20 năm, Windows XP không có khái niệm về các quy tắc khác nhau trong nhiều năm. Nó sẽ xem xét ngày 31 tháng 10 năm 2006 để được tiết kiệm ánh sáng ban ngày, khi nó thực sự không.

Nếu bạn chỉ giao dịch với những ngày sau năm 2007, thì bạn tốt, không cần phải làm gì đặc biệt. Nếu bạn đang xử lý các ngày trong hoặc trước năm 2006, thì bạn sẽ cần phải kiểm tra năm và áp dụng bù đắp DST theo cách thủ công.

+0

Aargh! Tôi nghĩ rằng họ có nghĩa là "tôi nên áp dụng điều chỉnh DST NGAY BÂY GIỜ" khi họ nói về các quy tắc điều chỉnh. Tôi vừa tìm thấy [link] này (http://www.techrepublic.com/article/what-net-developers-need-to-know-about-daylight-saving-time-changes/6160501) nói rằng bạn đúng . Cảm ơn! – TrueWill

1

Bạn có thể sử dụng phương thức System.TimeZoneInfo.ConvertTime (DateTime, TimeZoneInfo, TimeZoneInfo) để chuyển đổi thời gian từ múi giờ nguồn thành múi giờ địa phương của người dùng.

+0

+1 để chỉ cho tôi đúng hướng, nhưng đây chỉ là một nửa câu trả lời. Tôi tìm thấy các ghi chú WinXP tại [link] (http://msdn.microsoft.com/en-us/library/system.timezoneinfo.local.aspx). Có lẽ 'TimeZoneInfo.ConvertTimeFromUtc (utcDate, TimeZoneInfo.FindSystemTimeZoneById (TimeZoneInfo.Local.Id))'? – TrueWill

Các vấn đề liên quan