Ich habe Datum und Uhrzeit in einer Zeichenfolge, die so formatiert ist:
"2011-03-21 13:26" //year-month-day hour:minute
Wie kann ich es analysieren System.DateTime
?
Ich möchte Funktionen wie DateTime.Parse()
oder DateTime.ParseExact()
wenn möglich verwenden, um das Format des Datums manuell festlegen zu können.
Antworten:
DateTime.Parse()
Ich werde versuchen, das Format des angegebenen Datums herauszufinden, und es macht normalerweise einen guten Job. Wenn Sie garantieren können, dass die Daten immer in einem bestimmten Format vorliegen, können Sie Folgendes verwendenParseExact()
:(Beachten Sie jedoch, dass es normalerweise sicherer ist, eine der TryParse-Methoden zu verwenden, wenn ein Datum nicht das erwartete Format hat.)
Stellen Sie sicher, dass Sie beim Erstellen von Formatzeichenfolgen die benutzerdefinierten Formatzeichenfolgen für Datum und Uhrzeit aktivieren , und achten Sie insbesondere auf die Anzahl der Buchstaben und Groß- / Kleinschreibung (dh "MM" und "mm" bedeuten sehr unterschiedliche Bedeutungen).
Eine weitere nützliche Ressource für Zeichenfolgen im C # -Format ist die Zeichenfolgenformatierung in C #
quelle
s
. Daher ist es besser, TryParseExcact zu verwenden . Ich habe in meiner Antwort unten darauf hingewiesen, warum.Wie ich später erläutere, würde ich immer die
TryParse
undTryParseExact
Methoden bevorzugen . Da die Verwendung etwas umfangreich ist , habe ich eine Erweiterungsmethode geschrieben, die das Parsen erheblich vereinfacht:Im Gegensatz zu
Parse
,ParseExact
usw. wirft es keine Ausnahme, und ermöglicht es Ihnen , über zu überprüfenif (dt.HasValue) { // continue processing } else { // do error handling }
ob die Konvertierung erfolgreich war (in diesem Fall
dt
hat sie einen Wert, über den Sie zugreifen könnendt.Value
) oder nicht (in diesem Fall ist dies der Fallnull
).Damit können sogar elegante Verknüpfungen wie der "Elvis" -Operator verwendet werden
?.
, zum Beispiel:Hier können Sie auch
year.HasValue
überprüfen, ob die Konvertierung erfolgreich war, und wenn sie nicht erfolgreich waryear
, enthält sienull
den Jahresanteil des Datums. Es wird keine Ausnahme ausgelöst, wenn die Konvertierung fehlgeschlagen ist.Lösung: Die Erweiterungsmethode .ToDate ()
Probieren Sie es in .NetFiddle aus
Einige Informationen zum Code
Sie fragen sich vielleicht, warum ich den
InvariantCulture
Aufruf verwendet habeTryParseExact
: Dies dient dazu, die Funktion zu zwingen, Formatmuster immer gleich zu behandeln (andernfalls könnte beispielsweise "." Auf Englisch als Dezimaltrennzeichen interpretiert werden, während es sich um ein Gruppentrennzeichen oder ein Datumstrennzeichen handelt Deutsche). Denken Sie daran, dass wir die kulturbasierten Formatzeichenfolgen bereits einige Zeilen zuvor abgefragt haben, sodass dies hier in Ordnung ist.Update:
.ToDate()
(ohne Parameter) Standardmäßig werden jetzt alle gängigen Datums- / Zeitmuster der aktuellen Kultur des Threads verwendet.Beachten Sie, dass wir das
result
unddt
zusammen benötigen , daTryParseExact
es nicht erlaubt, es zu verwendenDateTime?
, was wir zurückgeben möchten. In C # Version 7 können Sie dieToDate
Funktion wie folgt vereinfachen :oder, wenn Sie es noch kürzer mögen:
in dem Fall , dass Sie die beiden Erklärungen nicht brauchen
DateTime? result = null;
undDateTime dt;
überhaupt - Sie kann es in einer Zeile Code tun. (Es wäre auch erlaubt zu schreibenout DateTime dt
anstattout var dt
wenn Sie das bevorzugen).Ich habe den Code weiter unter Verwendung des vereinfachten
params
Stichwort: Jetzt haben Sie nicht die 2 brauchen nd überladene Methode nicht mehr.Anwendungsbeispiel
Wie Sie sehen können, wird in diesem Beispiel nur abgefragt
dt.HasValue
, ob die Konvertierung erfolgreich war oder nicht. Als zusätzlichen Bonus können Sie mit TryParseExact streng festlegen,DateTimeStyles
damit Sie genau wissen, ob eine richtige Datums- / Zeitzeichenfolge übergeben wurde oder nicht.Weitere Anwendungsbeispiele
Mit der überladenen Funktion können Sie ein Array gültiger Formate übergeben, die zum Parsen / Konvertieren von Daten verwendet werden, wie hier gezeigt (
TryParseExact
unterstützt dies direkt), zWenn Sie nur wenige Vorlagenmuster haben, können Sie auch schreiben:
Fortgeschrittene Beispiele
Sie können den
??
Operator verwenden, um standardmäßig ein ausfallsicheres Format zu verwenden, zIn diesem Fall wird die
.ToDate()
würde gemeinsame lokale Kultur Datumsformate verwenden, und wenn alle diese versagen, würde es versuchen , das zu verwenden , ISO - Standard - Format"yyyy-MM-dd HH:mm:ss"
als Ausweich. Auf diese Weise ermöglicht die Erweiterungsfunktion das einfache "Verketten" verschiedener Fallback-Formate.Sie können die Erweiterung sogar in LINQ verwenden. Probieren Sie dies aus (oben in der .NetFiddle):
Dadurch werden die Daten im Array im laufenden Betrieb mithilfe der Muster konvertiert und an die Konsole ausgegeben.
Hintergrundinformationen zu TryParseExact
Zum Schluss hier einige Kommentare zum Hintergrund (dh der Grund, warum ich es so geschrieben habe):
Ich bevorzuge TryParseExact in dieser Erweiterungsmethode, weil Sie die Ausnahmebehandlung vermeiden. Sie können in Eric Lipperts Artikel über Ausnahmen lesen, warum Sie TryParse anstelle von Parse verwenden sollten. Ich zitiere ihn zu diesem Thema: 2)
Er tut, aber ,
TryParse
undTryParseExact
beide sind immer noch viel weniger als komfortabel zu bedienen: Sie zwingen Sie eine nicht initialisierte Variable als verwendenout
Parameter , die keine Nullwerte enthalten sein müssen , und während Sie konvertieren Sie die boolean Rückgabewert bewerten müssen - entweder Sie haben Um eineif
Anweisung sofort zu verwenden, müssen Sie den Rückgabewert in einer zusätzlichen booleschen Variablen speichern, damit Sie die Prüfung später durchführen können. Und Sie können die Zielvariable nicht einfach verwenden, ohne zu wissen, ob die Konvertierung erfolgreich war oder nicht.In den meisten Fällen möchten Sie nur wissen, ob die Konvertierung erfolgreich war oder nicht (und natürlich den Wert, wenn sie erfolgreich war) . Daher wäre eine nullfähige Zielvariable, die alle Informationen enthält, wünschenswert und viel eleganter - da die gesamte Information ist nur an einem Ort gespeichert: Das ist konsistent und einfach zu bedienen und viel weniger fehleranfällig.
Die Erweiterungsmethode, die ich geschrieben habe, macht genau das (sie zeigt Ihnen auch, welche Art von Code Sie jedes Mal schreiben müssten, wenn Sie ihn nicht verwenden würden).
Ich glaube, der Vorteil von
.ToDate(strDateFormat)
ist, dass es einfach und sauber aussieht - so einfach wie das OriginalDateTime.Parse
sein sollte -, aber mit der Fähigkeit zu überprüfen, ob die Konvertierung erfolgreich war, und ohne Ausnahmen zu werfen.1) Damit ist gemeint, dass die Ausnahmebehandlung (dh ein
try { ... } catch(Exception ex) { ...}
Block) - die erforderlich ist, wenn Sie Parse verwenden, weil sie eine Ausnahme auslöst, wenn eine ungültige Zeichenfolge analysiert wird - in diesem Fall nicht nur unnötig, sondern auch ärgerlich ist Ihren Code komplizieren. TryParse vermeidet dies alles, wie das von mir bereitgestellte Codebeispiel zeigt.2) Eric Lippert ist ein berühmter StackOverflow-Mitarbeiter und arbeitete einige Jahre bei Microsoft als Hauptentwickler im C # -Compilerteam.
quelle
Schauen Sie sich diesen Link für andere Formatzeichenfolgen an!
quelle
DateTime.Parse () sollte für dieses Zeichenfolgenformat einwandfrei funktionieren. Referenz:
http://msdn.microsoft.com/en-us/library/1k1skd40.aspx#Y1240
Wirft es eine FormatException für Sie aus?
quelle
Fügen Sie den Wert einer für Menschen lesbaren Zeichenfolge mit folgendem Code in eine .NET DateTime ein:
quelle
Die einfache und unkomplizierte Antwort ->
quelle
Sie können auch XmlConvert.ToDateString verwenden
Es ist gut, die Datumsart anzugeben. Der Code lautet:
Weitere Details zu verschiedenen Parsing-Optionen http://amir-shenodua.blogspot.ie/2017/06/datetime-parsing-in-net.html
quelle
Versuchen Sie den folgenden Code
quelle