2013-03-02 9 views
14

Potrzebuję pomocy przy konwersji DateTime do określonej strefy czasowej. To, co mam poniżej, nie działa poprawnie.Jak przekonwertować datetime na konkretną strefę czasową wC#?

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

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

Kiedy debugowanie wartość time, który powinien być 03/01/2013 8:00:00 PM, gdy strefa jest stosowany, to wraca jak 03/02/2013 1:00:00 AM.

Jeśli wykonam time.ToLocalTime(), otrzymam poprawną wartość. Muszę jednak przekonwertować time na różne strefy czasowe.

+0

Czy rozważałeś używać czasu Noda? https://code.google.com/p/noda-time/ –

+0

Chciałem również zaproponować noda-time, użyłem także http://www.babiej.demon.nl/Tz4Net/main.htm z sukcesem – JeremyWeir

+0

@RayCheng Dam ci szansę. Dziękuję Ci. –

Odpowiedz

5

Spróbuj coś jak poniżej Chace

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

obiekty DateTime mają „rodzaj” zmienną, która pomaga TimeZoneInfo wiedzieć jak ją leczyć. W MSDN documentation dla TimeZone.ConvertTime ma następujący:

DateTimeKind.Local, konwertuje do czasu lokalnego czasu w destinationTimeZone.

DateTimeKind.Utc, konwertuje uniwersalnym czasem koordynowanym (UTC) do czasu w destinationTimeZone.

DateTimeKind.Unspecified, Zakładany jako lokalny.

Na przykład:

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

Wyniki w:

 
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 

lub jeśli lokalna strefa czasowa jest 'Eastern Standard Time' można uzyskać te wyniki

 
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 



Jeśli chcesz, aby TimeZoneInfo traktował "Nieokreślony" jak Utc, powinieneś działać jak TimeZoneInfo.ConvertTimeFromUtc. Ponownie od MSDN documentation

DateTimeKind.Local, Zgłasza wyjątek ArgumentException.

DateTimeKind.Unspecified lub DateTimeKind.Utc, przekształca ze skoordynowanego czasu uniwersalnego (UTC).

Powiązane problemy