Ich habe das folgende Datum im Zeichenfolgenformat "2011-29-01 12:00 am". Jetzt versuche ich, das mit dem folgenden Code in das Datum / Uhrzeit-Format zu konvertieren:
DateTime.TryParse(dateTime, out dt);
Aber ich bekomme immer dt als {01.01.0001 00:00:00}. Kannst du mir bitte sagen warum? und wie kann ich diese Zeichenfolge in Datum konvertieren.
EDIT: Ich habe gerade gesehen, dass alle erwähnten Formatargumente verwenden. Ich werde jetzt erwähnen, dass ich den Formatparameter nicht verwenden kann, da ich einige Einstellungen zum Auswählen des benutzerdefinierten Datumsformats habe, das der Benutzer wünscht, und basierend auf diesem Benutzer das Datum in einem Textfeld in diesem Format automatisch über jQuery datepicker abrufen kann.
TryParse
. Das istbool success = DateTime.TryParse(...);
.Antworten:
Dies sollte anhand Ihres Beispiels "2011-29-01 12:00 am" funktionieren.
DateTime dt; DateTime.TryParseExact(dateTime, "yyyy-dd-MM hh:mm tt", CultureInfo.InvariantCulture, DateTimeStyles.None, out dt);
quelle
Sie müssen die
ParseExact
Methode verwenden . Dies nimmt eine Zeichenfolge als zweites Argument, das das Format angibt, in dem die Datums- / Uhrzeitangabe vorliegt, zum Beispiel:// Parse date and time with custom specifier. dateString = "2011-29-01 12:00 am"; format = "yyyy-dd-MM h:mm tt"; try { result = DateTime.ParseExact(dateString, format, provider); Console.WriteLine("{0} converts to {1}.", dateString, result.ToString()); } catch (FormatException) { Console.WriteLine("{0} is not in the correct format.", dateString); }
Wenn der Benutzer ein Format in der Benutzeroberfläche angeben kann, müssen Sie dieses in eine Zeichenfolge übersetzen, die Sie an diese Methode übergeben können. Sie können das entweder tun es dem Benutzer ermöglicht , das Format - String direkt eingeben - auch wenn dies bedeutet , dass die Umwandlung wahrscheinlicher ist zum Scheitern verurteilt , da sie wird ein ungültiges Format Zeichenkette eingeben - oder ein Kombinationsfeld, die mit den möglichen Optionen präsentiert ihnen und du Richten Sie die Formatzeichenfolgen für diese Auswahl ein.
Wenn es wahrscheinlich ist, dass die Eingabe falsch ist (z. B. Benutzereingabe), ist es besser, sie zu verwenden
TryParseExact
Ausnahmen als Ausnahmen zu verwenden, um den Fehlerfall zu behandeln:// Parse date and time with custom specifier. dateString = "2011-29-01 12:00 am"; format = "yyyy-dd-MM h:mm tt"; DateTime result; if (DateTime.TryParseExact(dateString, format, provider, DateTimeStyles.None, out result)) { Console.WriteLine("{0} converts to {1}.", dateString, result.ToString()); } else { Console.WriteLine("{0} is not in the correct format.", dateString); }
Eine bessere Alternative könnte darin bestehen , nicht den Benutzer mit einer Auswahl von Datumsformaten vorhanden, aber die Verwendung Überlastung , die ein Array von Formaten statt :
// A list of possible American date formats - swap M and d for European formats string[] formats= {"M/d/yyyy h:mm:ss tt", "M/d/yyyy h:mm tt", "MM/dd/yyyy hh:mm:ss", "M/d/yyyy h:mm:ss", "M/d/yyyy hh:mm tt", "M/d/yyyy hh tt", "M/d/yyyy h:mm", "M/d/yyyy h:mm", "MM/dd/yyyy hh:mm", "M/dd/yyyy hh:mm", "MM/d/yyyy HH:mm:ss.ffffff" }; string dateString; // The string the date gets read into try { dateValue = DateTime.ParseExact(dateString, formats, new CultureInfo("en-US"), DateTimeStyles.None); Console.WriteLine("Converted '{0}' to {1}.", dateString, dateValue); } catch (FormatException) { Console.WriteLine("Unable to convert '{0}' to a date.", dateString); }
Wenn Sie die möglichen Formate aus einer Konfigurationsdatei oder Datenbank lesen, können Sie diese hinzufügen, wenn Sie auf die verschiedenen Arten der Eingabe von Datumsangaben stoßen.
quelle
Versuchen Sie es mit der sicheren TryParseExact-Methode
DateTime temp; string date = "2011-29-01 12:00 am"; DateTime.TryParseExact(date, "yyyy-dd-MM hh:mm tt", CultureInfo.InvariantCulture, DateTimeStyles.None, out temp);
quelle
Ab DateTime auf msdn:
Verwenden Sie
"yyyy-dd-MM hh:mm tt"
stattdessen parseexact mit der Formatzeichenfolge .quelle
Das funktioniert:
DateTime dt = DateTime.ParseExact("2011-29-01 12:00 am", "yyyy-dd-MM hh:mm tt", System.Globalization.CultureInfo.InvariantCulture);
quelle
DateTime dt = DateTime.ParseExact("11-22-2012 12:00 am", "MM-dd-yyyy hh:mm tt", System.Globalization.CultureInfo.InvariantCulture);
quelle
Wenn Sie dem Benutzer die Möglichkeit geben, das Datums- / Uhrzeitformat zu ändern, müssen Sie eine entsprechende Formatzeichenfolge erstellen, die zum Parsen verwendet werden soll. Wenn Sie die möglichen Datumsformate kennen (dh der Benutzer muss aus einer Liste auswählen), ist dies viel einfacher, da Sie diese Formatzeichenfolgen zur Kompilierungszeit erstellen können.
Wenn Sie dem Benutzer erlauben, das Datums- / Uhrzeitformat im Freiformat zu entwerfen, müssen Sie zur
DateTime
Laufzeit die entsprechenden Formatzeichenfolgen erstellen .quelle