DateTime.TryParse-Problem mit Datumsangaben im Format JJJJ-TT-MM

84

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.

Rocky Singh
quelle
4
Übrigens können Sie feststellen, ob die Konvertierung fehlgeschlagen ist, indem Sie den Rückgabewert von überprüfen TryParse. Das ist bool success = DateTime.TryParse(...);.
Jim Mischel

Antworten:

188

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);
Glasscherben
quelle
8
Schlage mich dazu. Wenn Sie das Format Ihrer Eingabezeichenfolge kennen, sollten Sie praktisch immer TryParseExact / ParseExact-Methoden verwenden.
Euro Micelli
Okay, mein Datumsformat ähnelt dem im Beispiel, aber wenn der Tag- oder Monatswert einstellig ist, gibt der DateTime-Parser einen Fehler zurück, da er nach zwei Ziffern sucht, wenn nur eine vorhanden ist. Was würden Sie in diesem Szenario vorschlagen?
Ciaran Gallagher
11
Um meine eigene Frage zu beantworten: In diesem Fall funktioniert ein einzelnes Zeichen im Format sowohl für Einzel- als auch für Doppelzeichendaten. zB d / m / yyyy arbeitet für 13/11/2012
Ciaran Gallagher
@BrokenGlass das funktioniert nicht für mich Kannst du mir bitte dabei helfen
Meena
2
@CiaranGallagher Nur eine kleine Bemerkung, das Datum in Ihrem Kommentar sollte großes M (d / M / yyyy)
Yusril Maulidan Raji
14

Sie müssen die ParseExactMethode 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.

ChrisF
quelle
5

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);
KateA
quelle
4

Ab DateTime auf msdn:

Typ: System.DateTime% Wenn diese Methode zurückgegeben wird, enthält sie den DateTime-Wert, der dem in s enthaltenen Datum und der Uhrzeit entspricht, wenn die Konvertierung erfolgreich war, oder MinValue, wenn die Konvertierung fehlgeschlagen ist . Die Konvertierung schlägt fehl, wenn der Parameter s null ist, eine leere Zeichenfolge ("") ist oder keine gültige Zeichenfolgendarstellung von Datum und Uhrzeit enthält. Dieser Parameter wird nicht initialisiert übergeben.

Verwenden Sie "yyyy-dd-MM hh:mm tt"stattdessen parseexact mit der Formatzeichenfolge .

RedDeckWins
quelle
3

Das funktioniert:

DateTime dt = DateTime.ParseExact("2011-29-01 12:00 am", "yyyy-dd-MM hh:mm tt", System.Globalization.CultureInfo.InvariantCulture);
Lucas S.
quelle
1
DateTime dt = DateTime.ParseExact("11-22-2012 12:00 am", "MM-dd-yyyy hh:mm tt", System.Globalization.CultureInfo.InvariantCulture);
Hridayeshwar
quelle
0

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 DateTimeLaufzeit die entsprechenden Formatzeichenfolgen erstellen .

Jim Mischel
quelle
Das ist richtig jim Wenn Sie dem Benutzer erlauben, das Datums- / Zeitformat im Freiformat zu entwerfen, müssen Sie zur Laufzeit die entsprechenden DateTime-Formatzeichenfolgen erstellen.
Pinal