2013-03-02 40 views
14

Tôi cần trợ giúp chuyển đổi DateTime thành múi giờ cụ thể. Những gì tôi có dưới đây không hoạt động chính xác.Làm thế nào để chuyển đổi một ngày giờ thành múi giờ cụ thể trong C#?

gmTime = 03/02/2013 1:00:00 AM

TimeZoneInfo timeZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); 
var time = timeZoneInfo.ConvertTime(gmTime, timeZone); 

Khi tôi gỡ lỗi giá trị của time, mà nên 03/01/2013 8:00:00 PM khi vùng được áp dụng, nó trở lại như 03/02/2013 1:00:00 AM.

Nếu tôi làm time.ToLocalTime() thì tôi nhận được giá trị chính xác. Tuy nhiên, tôi cần phải chuyển đổi time thành các múi giờ khác nhau.

+0

Bạn có cân nhắc sử dụng thời gian Noda thay thế không? https://code.google.com/p/noda-time/ –

+0

Tôi cũng sẽ đề xuất thời gian noda, tôi cũng đã sử dụng http://www.babiej.demon.nl/Tz4Net/main.htm với thành công – JeremyWeir

+0

@RayCheng Tôi sẽ quay lại. Cảm ơn bạn. –

Trả lời

5

Hãy thử một cái gì đó giống như Chace sau

TimeZoneInfo estTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); 
DateTime estDateTime = TimeZoneInfo.ConvertTimeFromUtc(timeUtc, estTimeZone); 
13

đối tượng DateTime có một "Kind" biến giúp TimeZoneInfo biết làm thế nào để đối xử với nó. Trong các MSDN documentation cho TimeZone.ConvertTime nó có những điều sau đây:

DateTimeKind.Local, Chuyển đổi giờ địa phương thành thời gian trong DestinationTimeZone.

DateTimeKind.Utc, Chuyển đổi giờ quốc tế phối hợp (UTC) thành thời gian trong destinationTimeZone.

DateTimeKind.Unspecified, Assumed to Local.

Ví dụ:

Console.WriteLine("Local time zone is '{0}'.", TimeZoneInfo.Local.Id); 

    var gmTime   = new DateTime(2013, 03, 02, 01, 00, 00, DateTimeKind.Utc); 
    var localTime  = new DateTime(2013, 03, 02, 01, 00, 00, DateTimeKind.Local); 
    var unspecifiedTime = new DateTime(2013, 03, 02, 01, 00, 00); 

    var timeZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); 

    var gmTimeConverted   = TimeZoneInfo.ConvertTime(gmTime,   timeZone); // 03/02/2013 8:00:00AM 
    var localTimeConverted  = TimeZoneInfo.ConvertTime(localTime,  timeZone); // 03/02/2013 
    var unspecifiedTimeConverted = TimeZoneInfo.ConvertTime(unspecifiedTime, timeZone); 

    Console.WriteLine("Converting GMT   to EST: {0}", gmTimeConverted); 
    Console.WriteLine("Converting Local  to EST: {0}", localTimeConverted); 
    Console.WriteLine("Converting Unspecified to EST: {0}", unspecifiedTimeConverted); 

Kết quả trong:

 
Local time zone is 'Pacific Standard Time'. 
Converting GMT   to EST: 3/1/2013 8:00:00 PM 
Converting Local  to EST: 3/2/2013 4:00:00 AM 
Converting Unspecified to EST: 3/2/2013 4:00:00 AM 

Hoặc nếu múi giờ địa phương của bạn là 'Giờ chuẩn Đông' bạn sẽ có được những kết quả

 
Local time zone is 'Eastern Standard Time'. 
Converting GMT   to EST: 3/1/2013 8:00:00 PM 
Converting Local  to EST: 3/2/2013 1:00:00 AM 
Converting Unspecified to EST: 3/2/2013 1:00:00 AM 



Nếu bạn muốn TimeZoneInfo xử lý 'Không xác định' như Utc, bạn nên hoạt động như TimeZoneInfo.ConvertTimeFromUtc. Một lần nữa từ MSDN documentation

DateTimeKind.Local, Ném một ArgumentException.

DateTimeKind.Unspecified hoặc DateTimeKind.Utc, Chuyển đổi từ Giờ quốc tế phối hợp (UTC).

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