C# – Rufen Sie DateTime oder DateTimeOffset im UTC-Format oder im Zeitzonenformat ab

C# – Rufen Sie DateTime oder DateTimeOffset im UTC-Format oder im Zeitzonenformat ab

Die meisten APIs, auf die Sie stoßen, verwenden einen Standard für das Datums- und Zeitformat, oft ist es das ISO 8601-Format, bekannt als Round-Trip-Datums-/Zeitmuster. Sie können dieses Standardformat von einer DateTime erhalten, indem Sie den Parameter "O" angeben zu einem ToString anrufen, es gibt jedoch einige Fallstricke, auf die Sie achten müssen.

Different DateTimeKind gibt unterschiedliche ToString("O")-Ausgabe

Sie können den ToString verwenden -Methode für die DateTime-Struktur wie folgt:

var dateTimeNowS = DateTime.Now.ToString("O");
//dateTimeNowS is "2022-01-21T22:06:21.9883794+02:00"

Dadurch erhalten Sie das Format „2022-01-21T22:06:21.9883794+02:00“, das eine hohe Genauigkeit und eine Zeitzone hat, die Zeitzone ist Ihr lokaler Offset, für mich in Dänemark ist das +02:00. Alternativ hätten Sie das Format selbst folgendermaßen definieren können, was genau das gleiche Ergebnis liefern würde:

var dateTimeNowCustomS = DateTime.Now.
   ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK");
//dateTimeNowCustomS is "2022-01-21T22:06:21.9883794+02:00"

Hier können Sie mehr über das Erstellen spezifischer Formate für DateTime lesen.

Möglicherweise haben Sie erwartet, das UTC-Format zu erhalten, das als "Null-Offset" -Format bekannt ist und auch leicht am großen "Z" am Ende zu erkennen ist. Allerdings der Aufruf an die ToString Methode von DateTime gibt dies nur zurück, wenn DateTime von der Art "UTC" ist. Intern verfolgt die DateTime-Struktur, ob es sich um eine Local, UTC oder Unspecified DateTime und den ToString handelt Methode wirkt entsprechend. Wenn wir UtcNow verwendet hätten statt .Now wir hätten eine UTC DateTime:

erhalten
var dateTimeUtcNowS = DateTime.UtcNow.ToString("O");
//dateTimeUtcNowS is "2022-01-21T20:11:59.0102110Z"

Wie im vorherigen Beispiel können Sie das Format selbst festlegen, wenn Sie dies bevorzugen:

var dateTimeNowUtcCustomS = DateTime.UtcNow.
   ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK");
//dateTimeNowUtcCustomS is "2022-01-21T20:11:59.0102110Z"

Aufgrund der Art und Weise, wie der K in der für ToString bereitgestellten Zeichenfolge funktioniert, wird die Zeitzone bei Datetimes in UTC-Zeit weggelassen.

UTC-Format von lokaler DateTime abrufen und umgekehrt

Mit ToUniversalTime können Sie den Typ der DateTIME jederzeit von Local auf UTC ändern Methode wie unten gezeigt:

var dateTimeNow = DateTime.Now;
var dateTimeNowS = dateTimeNow.ToString("O");
//dateTimeNowS is "2022-01-21T22:06:21.9883794+02:00"

var dateTimeNowUtc = dateTimeNow.ToUniversalTime(); //ToUniversalTime
var dateTimeNowUtcS = dateTimeNowUtc.ToString("O");
//dateTimeNowUtcS is "2022-01-21T20:06:21.9883794Z"

Und Sie können den umgekehrten Effekt erzielen, indem Sie ToLocalTime aufrufen Methode:

var dateTimeNowUtc = DateTime.UtcNow;
var dateTimeNowUtcS = dateTimeNowUtc.ToString("O");
//dateTimeNowUtcS is "2022-01-21T20:06:21.9883794Z"

var dateTimeNow = dateTimeNowUtc.ToLocalTime(); //ToLocalTime
var dateTimeNowS = dateTimeNow.ToString("O");
//dateTimeNowS is "2022-01-21T22:06:21.9883794+02:00"

DateTimeKind Unspecified

Neben UTC und lokaler DateTimeKind gibt es auch die Art Unspecified. Eine DateTime ist beispielsweise unspezifiziert, wenn sie aus einer Zeichenfolge geparst wird und keine richtige Zeitzone oder kein UTC-Format erhält. Auf diese Weise haben wir keine Chance zu wissen, was die Zeitzone sein soll und sie ist daher "unspezifiziert". Die nicht spezifizierte DateTime ergibt einen dritten Formattyp, wenn ToString("O") heißt:

var dateTimeNowUnspecified = 
    DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Unspecified);
var dateTimeNowUnspecifiedS = dateTimeNowUnspecified.ToString("O");
//dateTimeNowUnspecifiedS is "2022-01-21T22:37:18.5056238"

DateTimeOffset-Format

Beachten Sie für DateTimeOffset, dass Sie beim Aufruf von ToString("O") immer das Format mit einer Zeitzone erhalten :

var dateTimeOffsetNow = DateTimeOffset.Now;
var dateTimeOffsetNowS = dateTimeOffsetNow.ToString("O");
//dateTimeOffsetNowS is "2022-08-21T22:44:55.5370212+02:00"

var dateTimeOffsetUtcNow = DateTimeOffset.UtcNow;
var dateTimeOffsetUtcNowS = dateTimeOffsetUtcNow.ToString("O");
//dateTimeOffsetUtcNowS is "2022-08-21T20:44:55.5370212+00:00"

Ob Sie UtcNow anrufen oder einfach Now Sie werden mit dem gleichen Format enden. Da DateTimeOffset eher auf Offsets als auf DateTimeKind basiert. Der Offset ist für UtcNow unterschiedlich da es Ihnen immer den angepassten Offset von +00:00 gibt.

Sie können ein „Null-Offset“-Format erhalten, indem Sie es zuerst in eine DateTime vom Typ UTC konvertieren:

var dateTimeOffsetNow = DateTimeOffset.Now;
var dateTimeOffsetNowS = dateTimeOffsetNow.UtcDateTime.ToString("O");
//dateTimeNowUtcS is "2022-01-21T20:55:33.0794136Z"

Das ist es

Ich hoffe, Sie fanden dies hilfreich. Microsoft hat eine großartige Dokumentation zu diesem Thema, die jedoch ziemlich lang und überwältigend ist. Lassen Sie mich in den Kommentaren unten wissen, was Sie von dieser kürzeren Version halten!