2013-03-02 5 views
14

Ich brauche Hilfe um eine DateTime in eine bestimmte Zeitzone zu konvertieren. Was ich unten habe funktioniert nicht richtig.Wie konvertiert man eine Datetime in eine bestimmte Zeitzone in C#?

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

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

Wenn ich den Wert von time debuggen, die 03/01/2013 8:00:00 PM sein sollte, wenn die Zone angelegt wird, kommt es wieder als 03/02/2013 1:00:00 AM.

Wenn ich time.ToLocalTime() mache, dann bekomme ich den richtigen Wert. Allerdings muss ich time in verschiedene Zeitzonen umwandeln.

+0

Haben Sie in Betracht gezogen, stattdessen Noda zu verwenden? https://code.google.com/p/noda-time/ –

+0

Ich wollte Noda-Zeit vorschlagen, ich habe auch http://www.babiej.demon.nl/Tz4Net/main.htm verwendet mit Erfolg – JeremyWeir

+0

@RayCheng Ich werde es versuchen. Vielen Dank. –

Antwort

5

so etwas wie die folgenden Chace

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

Datetime-Objekte ein „Kind“ Variable Versuchen Sie, die Timezone hilft wissen, wie sie zu behandeln. Im MSDN documentation für TimeZone.ConvertTime hat es die folgenden:

DateTimeKind.Local, Wandelt die lokale Zeit auf die Zeit in destinationTimeZone.

DateTimeKind.Utc, konvertiert die koordinierte Weltzeit (UTC) in die Zeit in destinationTimeZone.

DateTimeKind.Unspecified, Angenommen, lokal zu sein.

Zum Beispiel:

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

Ergebnisse in:

 
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 

Oder wenn Ihre lokale Zeitzone 'Eastern Standard Time' erhalten Sie diese Ergebnisse

 
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 



Wenn Sie möchten, dass TimeZoneInfo 'Nicht spezifiziert' wie Utc behandelt, sollten Sie wie TimeZoneInfo.ConvertTimeFromUtc funktionieren. Wieder von MSDN documentation

DateTimeKind.Local, löst eine ArgumentException.

DateTimeKind.Unspecified oder DateTimeKind.Utc, konvertiert von Coordinated Universal Time (UTC).

Verwandte Themen