2016-11-18 3 views
-1

Meine App ruft ein DateTime-Objekt in UTC ab und muss es als Zeichenfolge im EST-Format ausgeben. Ich habe den folgenden Code versucht, aber wenn ich die Ausgabe der Offset zeigt immer noch als +00 bekommen: 00 statt -05: 00Konvertieren von UTC DateTime in EST DateTime mit korrektem Offset

static void Main(string[] args) 
    { 
     var currentDate = DateTime.Now.ToUniversalTime(); 
     var convertedTime = ConvertUtcToEasternStandard(currentDate); 

     Console.WriteLine(currentDate.ToString("yyyy-MM-ddTHH:mm:sszzz")); 
     Console.WriteLine(convertedTime.ToString("yyyy-MM-ddTHH:mm:sszzz")); 
    } 

private static DateTime ConvertUtcToEasternStandard(DateTime dateTime) 
    { 
     var easternZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); 
     return TimeZoneInfo.ConvertTimeFromUtc(dateTime, easternZone); 
    } 

Diese Ausgänge:

2016-11-18T06:56:14+00:00 
2016-11-18T01:56:14+00:00 

So ist die Zeit wird korrekt verschoben, aber der Offset bleibt bei +00: 00, wenn ich möchte, dass es -05: 00 ist. Irgendeine Idee, wie ich ein DateTime-Objekt mit dem korrekten Offset erhalten kann, wenn es mit der obigen Formatzeichenfolge ausgegeben wird?

+0

Sind Sie in der UTC-Zeit, durch Zufall? –

+0

Yeah, UK so derzeit in UTC – Ruddles

+0

Das ist dein Problem. Eine Antwort hinzugefügt. –

Antwort

1

Ich lese dies in der API vor nicht allzu langer Zeit, im Grunde, mit DateTime Werte, ist es sehr viel unmöglich, das zzz Format Offset zu etwas Nützliches zu bekommen.

Mit DateTime-Werten stellt der benutzerdefinierte Formatspezifizierer "zzz" den signierten Offset der lokalen Betriebssystem-Zeitzone von UTC dar, gemessen in Stunden und Minuten. Es spiegelt nicht den Wert der DateTime.Kind-Eigenschaft einer Instanz wider. Aus diesem Grund wird der Formatbezeichner "zzz" nicht für die Verwendung mit DateTime-Werten empfohlen.

Mit DateTimeOffset-Werten stellt dieser Formatbezeichner den Offset des DateTimeOffset-Werts von UTC in Stunden und Minuten dar.

Der Offset wird immer mit einem Vorzeichen angezeigt. Ein Pluszeichen (+) zeigt Stunden vor UTC und ein Minuszeichen (-) Stunden nach UTC an. Ein einstelliger Offset wird mit einer führenden Null formatiert.


Zum Beispiel, ich bin in Eastern Standard Time, und das ist mein Ergebnis:

2016-11-18T07:9:38-05:00 
2016-11-18T02:9:38-05:00 

Offensichtlich sollte die UTC-Zeit nicht einer von -05:00 versetzt hat.


Ändern Sie den Code nur ein bisschen und wir haben eine Lösung:

void Main() 
{ 
    var currentDate = DateTimeOffset.Now.ToUniversalTime(); 
    var convertedTime = ConvertUtcToEasternStandard(currentDate); 

    var format = "yyyy-MM-ddTHH:m:sszzz"; 
    Console.WriteLine(currentDate.ToString(format)); 
    Console.WriteLine(convertedTime.ToString(format)); 
} 

// Define other methods and classes here 
private static DateTimeOffset ConvertUtcToEasternStandard(DateTimeOffset dateTime) 
{ 
    var easternZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); 
    return TimeZoneInfo.ConvertTime(dateTime, easternZone); 
} 

Ergebnis:

2016-11-18T07:17:46+00:00 
2016-11-18T02:17:46-05:00 

, das wie es ist mehr.

Hinweis: Ersetzt vorherigen Code, Ignoranz hat das Beste von mir und ich habe nicht erkannt, dass es nicht richtig funktioniert. TimeZoneInfo.ConvertTime dauert eine was macht was wir wollen.

Und wenn wir fügen einen anderen Fall für Pacific Standard Time:

private static DateTimeOffset ConvertUtcToPacificStandard(DateTimeOffset dateTime) 
{ 
    var pacificZone = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"); 
    return TimeZoneInfo.ConvertTime(dateTime, pacificZone); 
} 

Wir das richtige Ergebnis erhalten:

2016-11-17T23:21:21-08:00 
+0

Das ist großartig, hat es mit dieser Antwort in meiner App funktioniert. Danke für die Hilfe :) – Ruddles

Verwandte Themen