Datumsformat JJJJ-MM-TTTHH: MM: SSZ


101

Ich gehe davon aus, dass dies ziemlich einfach sein sollte, aber ich konnte es nicht bekommen :(. In diesem Format ist Z die Zeitzone.
T ist ein langes Zeitmuster.
Wie könnte ich ein Datum in diesem Format bekommen, außer mit

DateTime dt = DateTime.Now;
Console.WriteLine(dt.ToString("yyyy-MM-ddTHH:mm:ssZ"));

in C #


Ich weiß, dass es diese Frage seit 9 Jahren gibt, aber die akzeptierte Antwort von UtcNow.ToString(s)+Zist die falsche. ISO8601 wird von der RoundTrip- Option unterstützt ToString("O"). Um auch darauf hinzuweisen, dass die akzeptierte Antwort den UTC-Wert der Datums- und Uhrzeitangabe verwendet, der immer die Zeitzone Z ergibt, anstatt nur den tatsächlichen Datums- / Uhrzeitwert zu verwenden, der (wenn Art = Lokal) eine Sommerzeitzone enthalten kann. Überlegen Sie, die akzeptierte Antwort zu ändern?
Richardissimo

Antworten:


144

UTC verwenden

ISO 8601 ( MSDN-Datums- / Uhrzeitformate )

Console.WriteLine(DateTime.UtcNow.ToString("s") + "Z");

2009-11-13T10: 39: 35Z

Das Z ist da da

Wenn die Zeit in UTC ist, fügen Sie direkt nach der Zeit ohne Leerzeichen ein 'Z' hinzu. 'Z' ist die Zonenbezeichnung für den Null-UTC-Offset. "09:30 UTC" wird daher als "09: 30Z" oder "0930Z" dargestellt. "14:45:15 UTC" wäre "14: 45: 15Z" oder "144515Z".

Wenn Sie einen Offset einfügen möchten

int hours = TimeZoneInfo.Local.BaseUtcOffset.Hours;
string offset = string.Format("{0}{1}",((hours >0)? "+" :""),hours.ToString("00"));
string isoformat = DateTime.Now.ToString("s") + offset;
Console.WriteLine(isoformat);

Zwei Dinge zu beachten: + oder - wird nach der Zeit benötigt, aber offensichtlich wird + nicht auf positiven Zahlen angezeigt. Laut Wikipedia kann der Offset im + hh-Format oder + hh: mm sein. Ich habe mich nur an Stunden gehalten.

Soweit ich weiß, soll RFC1123 (HTTP-Datum, der "u" -Formatierer) keine Zeitzonen-Offsets liefern. Alle Zeiten sollen GMT / UTC sein.


Cool. Ihre Ausgabe enthält jedoch nicht den TZ-Offset?
Neil Barnwell

Ich habe es hinzugefügt - die Dokumente sagen, dass das 's'-Format auf ISO8601 basiert. Ich glaube nicht, dass es die Zeitzone enthält.
Chris S

Natürlich hat UTC keine Zeitzonen. D'oh. Er fragt in seiner Ausgabe nach Zeitzoneninformationen. Vielleicht ist das DateTimeOffset genau das, wonach er sucht?
Neil Barnwell

5
Das manuelle Hinzufügen von Z ist nicht gut. Sie sollten .ToString ("o") verwenden, da dies die richtige Ausgabe liefert. Wenn Millisekunden ein Problem darstellen, sollten sie gerundet werden. Das manuelle Hinzufügen von Z kann zu falschen Ergebnissen führen, wenn Sie es zur Ortszeit hinzufügen, was nicht wirklich UTC ist.
Tuukka Lindroos

66
Console.WriteLine(DateTime.UtcNow.ToString("o"));  
Console.WriteLine(DateTime.Now.ToString("o"));

Ausgänge:

2012-07-09T19:22:09.1440844Z  
2012-07-09T12:22:09.1440844-07:00

Ich habe Console.WriteLine (DateTime.Now.ToString ("o")) verwendet. Vielen Dank
Ziggler

5
Die akzeptierte Antwort besagt, dass der Formatbezeichner "s" verwendet und am Ende ein Z für UTC-Daten angehängt werden soll. Das ist alles gut und gut, wenn Sie die Millisekunden nicht benötigen, aber wenn Sie die Millisekunden möchten, müssen Sie "o" verwenden, wie diese Antwort zeigt. Mit "o" werden die Millisekunden standardmäßig angezeigt und das Z wird bereits am Ende für UTC-Daten angehängt.
Jim

1
DateTime.Now.ToString ("o") Löst alle Arten von Problemen, da der richtige Offset zurückgegeben wird.
Mo Zaatar

12

Das "o" -Format unterscheidet sich zwischen DateTime und DateTimeOffset :(

DateTime.UtcNow.ToString("o") -> "2016-03-09T03:30:25.1263499Z"

DateTimeOffset.UtcNow.ToString("o") -> "2016-03-09T03:30:46.7775027+00:00"

Meine endgültige Antwort ist

DateTimeOffset.UtcDateTime.ToString("o")   //for DateTimeOffset type
DateTime.UtcNow.ToString("o")              //for DateTime type

7

In C # 6+ können Sie die Zeichenfolgeninterpolation verwenden und diese knapper machen:

$"{DateTime.UtcNow:s}Z"

Du hast mir viel Zeit gespart. Einfache und süße Lösung.
Raju Paladiya

6

Schauen Sie sich hier die Muster "u" und "s" an. Das erste ist ohne 'T'-Trennzeichen und das zweite ohne Zeitzonensuffix.



5

Eine Option könnte darin bestehen, DateTime in ToUniversalTime () zu konvertieren, bevor im "o" -Format in einen String konvertiert wird. Beispielsweise,

var dt = DateTime.Now.ToUniversalTime();
Console.WriteLine(dt.ToString("o"));

Es wird ausgegeben:

2016-01-31T20:16:01.9092348Z

2

Es funktioniert problemlos mit den Datetime-Formaten der Salesforce REST-API-Abfrage

DateTime now = DateTime.UtcNow;
string startDate = now.AddDays(-5).ToString("yyyy-MM-ddTHH\\:mm\\:ssZ");   
string endDate = now.ToString("yyyy-MM-ddTHH\\:mm\\:ssZ");  
//REST service Query 
string salesforceUrl= https://csxx.salesforce.com//services/data/v33.0/sobjects/Account/updated/?start=" + startDate + "&end=" + endDate;

// https://csxx.salesforce.com/services/data/v33.0/sobjects/Account/updated/?start=2015-03-10T15:15:57Z&end=2015-03-15T15:15:57Z

Die Ergebnisse von Salesforce werden ohne Probleme zurückgegeben.


-6

Sie könnten die Dinge aufteilen, es würde mehr Code erfordern, aber es würde genau so funktionieren, wie Sie es mögen:

DateTime year = DateTime.Now.Year;
DateTime month = DateTime.Now.Month;
DateTime day = DateTime.Now.Day;

ect.

endlich:

Console.WriteLine(year+month+day+etc.);

Dies ist jedoch eine sehr mutige Art, damit umzugehen ...


Diese Antwort erzeugt nichts wie die gewünschte Ausgabe
cja

Dies lieferte nicht, was die Frage oder ich wollte ... -1
Ziggler
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.