Ich versuche DateTimeOffset
, einen bestimmten Zeitpunkt in einer beliebigen Zeitzone zu vermitteln. Ich kann nicht herausfinden, wie ich TimeZoneInfo
mit der Sommerzeit umgehen soll.
var dt = DateTime.UtcNow;
Console.WriteLine(dt.ToLocalTime());
var tz = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
var utcOffset = new DateTimeOffset(dt, TimeSpan.Zero);
Console.WriteLine(utcOffset.ToOffset(tz.BaseUtcOffset));
Dies druckt aus:
02.06.2010 16:37:19 Uhr 02.06.2010 15:37:19 -06: 00 Uhr
Ich bin in der zentralen Zeitzone und wir sind derzeit in der Sommerzeit. Ich versuche, die zweite Zeile zum Lesen zu bringen:
02.06.2010 16:37:19 -05: 00 Uhr
BaseUtcOffset
anscheinend ändert sich nicht basierend auf der Sommerzeit.
Wie kann ich mit dem richtigen Versatzwert den richtigen Zeitpunkt ermitteln?
c#
datetimeoffset
timezone
Jaminto
quelle
quelle
dt.Kind
ist richtig eingestellt.Antworten:
Sie müssen das UtcOffset aus TimeZoneInfo abrufen und dann an die ToOffset () -Methode übergeben:
quelle
DateTimeOffset
.Sie können auch TimeZoneInfo.ConvertTimeFromUtc verwenden, um die Sommerzeit zu berücksichtigen:
quelle
Oder besser, wenn Sie die Zeitzonen-ID nicht fest codieren möchten :
quelle
TimeZoneInfo.Local
direkt verwenden? Warum brauchen Sie den Anruf beiFindSystemTimeZoneById
?DateTime localDateTime = TimeZoneInfo.ConvertTimeFromUtc(networkDateTime, TimeZoneInfo.Local);
Ich bin ein Anfänger sowohl bei .NET als auch bei Stackoverflow, daher könnte ich mich irren, aber hier ist:
Die Verwendung von TimeZoneInfo.ConvertTimeFromUtc ermöglicht die Sommerzeit und konvertiert in die richtige Zeit entsprechend der Zeitzone + einem möglichen Sommerzeitversatz. Der Versatz selbst im resultierenden Objekt zeigt jedoch den Versatz für die Standardzeit an und berücksichtigt nicht die Sommerzeit. Wenn Sie also einen ToString für das Objekt ausführen möchten, erhalten Sie die richtige Zeit (in Stunden und Minuten), aber den falschen Versatz während der Sommerzeit, was später im Code zu einem falschen Zeitpunkt führen kann.
Wenn Sie stattdessen GetUtcOffset verwenden, um den Offset für eine bestimmte Zeit abzurufen, und dann ein ToOffset für das DateTimeOffset-Objekt ausführen, werden sowohl die Stunden / Minuten als auch der Offset selbst korrekt konvertiert, und Sie können sicher einen ToString ausführen.
localTime gibt "2017-10-09T10: 00: 00 + 03: 00" zurück.
datetimeoffset timezoneinfo getutcoffset
quelle