2010-03-30 6 views
23

Ich habe einen UTC Datetime-Wert aus einer Rekord Datenbank kommen. Ich habe auch eine benutzerdefinierte Zeitzone (eine Instanz von TimeZoneInfo). Wie konvertiere ich diese UTC DateTime in die lokale Zeitzone des Benutzers? Wie kann ich feststellen, ob die benutzerdefinierte Zeitzone derzeit DST beobachtet? Ich benutze .NET 3.5.UTC Datetime auf einem anderen Zeitzone

Danke, Mark

Antwort

20

Werfen Sie einen Blick auf die DateTimeOffset Struktur:

// user-specified time zone 
TimeZoneInfo southPole = 
    TimeZoneInfo.FindSystemTimeZoneById("Antarctica/South Pole Standard Time"); 

// an UTC DateTime 
DateTime utcTime = new DateTime(2007, 07, 12, 06, 32, 00, DateTimeKind.Utc); 

// DateTime with offset 
DateTimeOffset dateAndOffset = 
    new DateTimeOffset(utcTime, southPole.GetUtcOffset(utcTime)); 

Console.WriteLine(dateAndOffset); 

Für DST die TimeZoneInfo.IsDaylightSavingTime Methode.

+0

Ich habe einen zusätzlichen Schritt zu gehen, um meine lokale Zeit zu erhalten: var offset = tzi.GetUtcOffset (utcTime); var siteLocalTime = utcTime.Add (Offset); return siteLocalTime.ToString ("MM/tt/HH: mm"); –

+5

Dieser Code wird nicht kompiliert. Diese Zeitzonen-ID existiert nicht und wenn Sie sie durch eine gültige ersetzen, erhalten Sie eine Fehlermeldung über 'Der UTC-Offset für Utc DateTime-Instanzen muss 0' sein. –

+0

um Fehler in dateAndOffset zu vermeiden Wählen Sie DateTime cstTime = utcTime.AddTicks (soutPole.BaseUtcOffset.Ticks); –

11

Die Antartica-Antwort funktioniert nur für die Zeitzonen, die UTC entsprechen. Ich bin ziemlich traumatisiert mit dieser Funktion und nach stundenlangem Ausprobieren habe ich es geschafft, eine praktische Konvertierungserweiterungsfunktion zu erstellen, die mit allen Zeitzonen funktioniert.

static public class DateTimeFunctions 
{ 
    static public DateTimeOffset ConvertUtcTimeToTimeZone(this DateTime dateTime, string toTimeZoneDesc) 
    { 
     if (dateTime.Kind != DateTimeKind.Utc) throw new Exception("dateTime needs to have Kind property set to Utc"); 
     var toUtcOffset = TimeZoneInfo.FindSystemTimeZoneById(toTimeZoneDesc).GetUtcOffset(dateTime); 
     var convertedTime = DateTime.SpecifyKind(dateTime.Add(toUtcOffset), DateTimeKind.Unspecified); 
     return new DateTimeOffset(convertedTime, toUtcOffset); 
    } 
} 

Beispiel:

var currentTimeInPacificTime = DateTime.UtcNow.ConvertUtcTimeToTimeZone("Pacific Standard Time"); 
+5

'statisches Publikum'? HERESY, BRENNE DIE HEXE –

20

Sie eine bestimmte Funktion innerhalb Timezone verwenden kann, wenn Sie einen Datetime in einer anderen Datetime konvertieren mögen:

DateTimeOffset newTime = TimeZoneInfo.ConvertTime(
    DateTimeOffset.UtcNow, 
    TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time") 
); 
24

Der beste Weg, dies zu tun ist einfach zu verwenden TimeZoneInfo.ConvertTimeFromUtc.

// you said you had these already 
DateTime utc = new DateTime(2014, 6, 4, 12, 34, 0); 
TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"); 

// it's a simple one-liner 
DateTime pacific = TimeZoneInfo.ConvertTimeFromUtc(utc, tzi); 

Der einzige Haken ist, dass der eingehende DateTime Wert nicht mit der DateTimeKind.Local Art haben kann. Es muss entweder Utc oder Unspecified.

0
 // TO get Currrent Time in current Time Zone of your System 

     var dt = DateTime.Now; 

     Console.WriteLine(dt); 

     // Display Time Zone of your System 

     Console.WriteLine(TimeZoneInfo.Local); 

     // Convert Current Date Time to UTC Date Time 

     var utc = TimeZoneInfo.ConvertTimeToUtc(dt, TimeZoneInfo.Local); 

     Console.WriteLine(utc); 

     // Convert UTC Time to Current Time Zone 

     DateTime pacific = TimeZoneInfo.ConvertTimeFromUtc(utc, TimeZoneInfo.Local); 

     Console.WriteLine(pacific); 

     Console.ReadLine(); 
Verwandte Themen