String in DateTime in C # analysieren
Habe ich Datum und Uhrzeit in einer Zeichenfolge formatiert, so wie die:
"2011-03-21 13:26" //year-month-day hour:minute
Wie kann ich analysieren, es zu System.DateTime
?
Möchte ich Funktionen wie DateTime.Parse()
oder DateTime.ParseExact()
wenn möglich, in der Lage sein, um das format der Datum manuell ein.
InformationsquelleAutor der Frage Hooch | 2011-03-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
DateTime.Parse()
wird versuchen, herauszufinden, das format des angegebenen Datums, und es macht in der Regel einen guten job. Wenn Sie garantieren können, die Termine werden immer in einem bestimmten format, dann können SieParseExact()
:(Aber beachten Sie, dass es in der Regel sicherer, verwenden Sie eine der TryParse-Methoden, im Falle dass ein Datum nicht im erwarteten format)
Stellen Sie sicher, zu überprüfen, Benutzerdefinierte Formatzeichenfolgen für Datum und Uhrzeit beim Aufbau der format-string, achten Sie besonders auf die Anzahl der Buchstaben und der Fall (z.B. "MM" und "mm" bedeuten sehr verschiedene Dinge).
Andere nützliche Ressource für die C# - format-strings ist String Formatierung in C#
InformationsquelleAutor der Antwort Mitch Wheat
Als ich später erklären, ich würde immer zugunsten der
TryParse
undTryParseExact
Methoden. Denn Sie sind ein bisschen sperrig zu benutzen, die ich geschrieben habe, ein Erweiterung Methode das macht die Analyse wesentlich einfacher:Im Gegensatz zu
Parse
ParseExact
etc. ist es nicht eine exception zu werfen, und ermöglicht es Ihnen, zu überprüfen, überif (dt.HasValue) { //continue processing } else { //do error handling }
ob die Konvertierung erfolgreich war (in diesem Fall
dt
einen Wert hat, können Sie den Zugriff überdt.Value
) oder nicht (in diesem Fall ist esnull
).Dass auch erlaubt mit eleganten Verknüpfungen wie der "Elvis"-operator
?.
zum Beispiel:Hier können Sie auch
year.HasValue
um zu überprüfen, ob die Konvertierung gelungen ist, und wenn es nicht gelingt, dannyear
enthaltennull
sonst das Jahr Teil des Datums. Es wird keine Ausnahme ausgelöst, wenn die Konvertierung fehlgeschlagen.Versuchen Sie es in .NetFiddle
Update:
.toDate()
(ohne Parameter) ist nun standardmäßig auf alle gängigen Datums - /Zeit-Muster der thread mit der aktuellen Kultur.Hinweisdass wir die
result
unddt
zusammen, weilTryParseExact
nicht zu verwendenDateTime?
die wir beabsichtigen, zurückzukehren.In C# - Version 7 könnten Sie vereinfachen die
toDate
- Funktion ein bisschen wie folgt:(Es wäre auch erlaubt sein, zu schreiben
out DateTime dt
stattout var dt
.)Beispiel:
Wie Sie sehen können, wird in diesem Beispiel nur Abfragen
dt.HasValue
um zu sehen, ob die Konvertierung erfolgreich war oder nicht. Als extra-bonus TryParseExact kann angegeben werden, strengenDateTimeStyles
so wissen Sie genau, ob eine korrekte Datum - /Zeit-string übergeben wurde oder nicht.N. B. Die überladene Funktion ermöglicht Ihnen die übergabe eines array der gültigen Formate verwendet zum Parsen/konvertieren von Daten, wie gezeigt, hier (
TryParseExact
direkt unterstützt), z.B.Jedoch, um den code kurz zu machen, ich bin mit nur TryParseExact-string-array überlastung, weil Sie nicht die Arbeit mit einem Generischen parameter.
Erweitertes Beispiel:
Sie können die
??
operator standardmäßig eine fail-safe-format, z.B.In diesem Fall, die
.toDate()
würde die Nutzung von gemeinsamen lokalen Kultur, Datumsformate, und wenn alle diese gescheitert, es würde versuchen, die ISO-standard format"yyyy-MM-dd HH:mm:ss"
als fallback. Diese Art der Erweiterung ermöglicht die Funktion "Kette" verschiedene fallback-Formate problemlos.Schließlich, Hier sind einige Kommentare über den hintergrund (also der Grund, warum ich geschrieben habe, es auf diese Weise):
Ich bin lieber TryParseExact in dieser extension-Methode, weil Sie vermeiden Ausnahmebehandlung - Sie können Lesen Sie in Eric Lippert ' s Artikel über Ausnahmen warum sollten Sie TryParse statt Parse ich ihn zitieren zu diesem Thema:2)
Tut es, aber
TryParse
undTryParseExact
beide sind immer noch viel weniger als komfortabel zu bedienen: Sie erzwingen Sie die Verwendung einer nicht initialisierten Variablen alsout
parameter darf nicht null sein, und während Sie konvertieren, müssen Sie bewerten den boolean-Wert zurückgeben - entweder Sie verwenden einif
Anweisung sofort oder speichert man den Rückgabewert in eine zusätzliche Boolesche variable, so sind Sie in der Lage zu tun, die später prüfen. Und können Sie nicht einfach die Ziel-variable, ohne zu wissen, ob die Konvertierung erfolgreich war oder nicht.In den meisten Fällen, Sie wollen einfach nur wissen ob die Konvertierung erfolgreich war oder nicht (und natürlich der Wert, wenn es erfolgreich war)so ein nullable-target-variable hält alle Informationen wäre wünschenswert und wesentlich eleganter - da die gesamte information ist nur an einem Ort gespeichert: konsistente und einfach zu bedienen, und viel weniger fehleranfällig.
Der Erweiterung Methode, die ich geschrieben habe, macht genau das (es zeigt Ihnen auch, welche Art von code, den Sie schreiben müssen jedes mal, wenn du nicht gehst, es zu benutzen).
Ich glaube, der Vorteil der
.toDate(strDateFormat)
ist, dass es sieht einfach und sauber - so einfach wie das originalDateTime.Parse
sein sollte - aber mit der Fähigkeit, zu überprüfen, ob die Konvertierung erfolgreich war, und ohne das auslösen von Ausnahmen.1) Was hier gemeint ist, ist, dass Ausnahmebehandlung (d.h. eine
try { ... } catch(Exception ex) { ...}
- block) -, die notwendig ist, wenn Sie Analysieren, weil es eine Ausnahme werfen wenn ein Ungültiger string geparst wird - das ist nicht nur in diesem Fall unnötig, sondern auch ärgerlich und erschweren den code. TryParse vermeidet all diese als das code-Beispiel habe ich gezeigt wird.2) Eric Lippert ist eine berühmte StackOverflow-fellow und arbeitete bei Microsoft als principal developer auf der C# - compiler-team für ein paar Jahre.
InformationsquelleAutor der Antwort Matt
Schauen Sie sich dieses link für die anderen format-strings!
InformationsquelleAutor der Antwort Rob
DateTime.Parse() sollte funktionieren für das string-format. Referenz:
http://msdn.microsoft.com/en-us/library/1k1skd40.aspx#Y1240
Ist es das werfen einer FormatException für Sie?
InformationsquelleAutor der Antwort cacois
Setzen Sie den Wert von einem für Menschen lesbaren string in eine .NET DateTime mit code wie diesem:
InformationsquelleAutor der Antwort Zack Peterson
Können Sie auch XmlConvert.ToDateString
var dateStr = "2011-03-21 13:26";
var parsedDate = XmlConvert.ToDateTime(dateStr, "yyyy-MM-dd hh:mm");
Ist es gut, das Datum anzugeben Art, wie
var anotherParsedDate = DateTime.ParseExact(dateStr, "yyyy-MM-dd hh:mm", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal);
Weitere Informationen über verschiedene Analyse-Optionen http://amir-shenodua.blogspot.ie/2017/06/datetime-parsing-in-net.html
InformationsquelleAutor der Antwort Amir Shenouda