Ich habe herausgefunden, wie man eine DateTime in ein ISO 8601- Format umwandelt, aber nichts darüber, wie man in C # das Gegenteil macht.
Ich habe 2010-08-20T15:00:00Z
und ich möchte es in ein DateTime
Objekt verwandeln .
Ich könnte die Teile der Saite selbst trennen, aber das scheint eine Menge Arbeit für etwas zu sein, das bereits ein internationaler Standard ist.
Antworten:
Diese Lösung verwendet die DateTimeStyles- Enumeration und funktioniert auch mit Z.
Dies druckt die Lösung perfekt.
quelle
DateTime d2= DateTime.Parse("2010-08-20T15:00:00Z", null, DateTimeStyles.RoundtripKind);
scheint gut zu funktionieren.DateTimeStyles.RoundtripKind?
MSDN-Beschreibung näher erläutern möchte, ist leer.2018-06-19T14:56:14.123Z
wird als Ortszeit analysiert, nicht als UTC. Ich benutzeCultureInfo.InvariantCulture
anstelle von null.DateTimeStyles.RoundTripKind
finden Sie unter stackoverflow.com/q/39572395/2014893Obwohl MSDN sagt, dass die Formate "s" und "o" den Standard widerspiegeln, scheinen sie nur eine begrenzte Teilmenge davon analysieren zu können. Insbesondere ist es ein Problem, wenn die Zeichenfolge eine Zeitzonenspezifikation enthält. (Weder für grundlegende ISO8601-Formate noch für Formate mit reduzierter Genauigkeit - dies ist jedoch nicht genau Ihr Fall.) Aus diesem Grund verwende ich beim Parsen von ISO8601 benutzerdefinierte Formatzeichenfolgen. Derzeit ist mein bevorzugter Ausschnitt:
Wenn es Ihnen nichts ausmacht, TZ-freie Zeichenfolgen zu analysieren (ich auch), können Sie eine "s" -Zeile hinzufügen, um die Anzahl der abgedeckten Formatänderungen erheblich zu erhöhen.
quelle
"yyyyMMdd"
dasformats
Array hinzufügen, um die Genauigkeit auf Tage zu reduzieren, da dies manchmal der Fall ist, wenn eine RFC 5545-RRULE auf einen DTSTART angewiesen ist, um die Zeit bereitzustellen.K
können Sie Ihre verschiedenen Zeitzonen-Handlings zusammenrollen. Ich habe eine umfangreichere Variante unter stackoverflow.com/a/31246449/400547, aber es ist, wenn etwas zu umfangreich ist (akzeptiert Dinge, die nach ISO 8601 gültig sind, aber in den gängigeren Profilen nicht verwendet werden), aber es zeigt, wieK
die Größe um a reduziert werden kann dritte.quelle
Hier ist eine, die für mich besser funktioniert ( LINQPad- Version):
produziert
quelle
Es scheint wichtig zu sein, das Format der ISO-Zeichenfolge genau anzupassen, damit
TryParseExact
es funktioniert. Ich denke, genau ist genau und diese Antwort ist für die meisten offensichtlich, aber trotzdem ...In meinem Fall funktioniert die Antwort von Reb.Cabin nicht, da ich eine etwas andere Eingabe habe als mein "Wert" unten.
Wert:
2012-08-10T14:00:00.000Z
Es gibt einige zusätzliche 000 für Millisekunden und es kann mehr geben.
Wenn ich jedoch einige
.fff
wie unten gezeigt zum Format hinzufüge , ist alles in Ordnung.Format String:
@"yyyy-MM-dd\THH:mm:ss.fff\Z"
Im VS2010-Sofortfenster:
wahr
Sie müssen möglicherweise auch verwenden,
DateTimeStyles.AssumeLocal
je nachdem, für welche Zone Ihre Zeit ist ...quelle
AssumeUniversal
zuAdjustToUniversal
.Dies funktioniert gut in LINQPad4:
quelle
DateTime.ParseExact(...)
Mit dieser Option können Sie dem Parser mitteilen, was jedes Zeichen darstellt.quelle