Als DateTime erkannte Dezimalwerte, anstatt von DateTime.Parse false zurückzugeben

9

Ich muss eine Prüfung basierend auf einem Zeichenfolgenwert durchführen, ob es sich um ein Datum oder eine Dezimalzahl handelt, aber die Datumsanalyse gibt immer true für die Dezimalzahl zurück.

string val = "3.5";
DateTime oDate = DateTime.Parse(val);

Es wird ein gültiges Datum zurückgegeben 3/5/2019 .

Wie kann ich eine Zeichenfolge überprüfen, um festzustellen, ob es sich um ein gültiges Datum handelt, wenn das Datumsformat nicht bekannt ist?

Munawar
quelle
6
Zuerst nach Dezimalstellen suchen? Oder verwenden DateTime.ParseExactSie, wenn Sie wissen, welche Formate es annehmen kann / sollte
A Friend
3
Sie können TryParseExactgültige Datumsformate verwenden und angeben.
Juharr
5
In der Tat - DateTime.Parseversucht mehrere Muster. Wenn Sie nur bestimmte erkennen möchten, analysieren Sie sie speziell.
Jon Skeet
1
Beantwortet das deine Frage? Überprüfen Sie mit DateTime.TryParse
Joost K

Antworten:

3

"Wie überprüfe ich eine Zeichenfolge, um zu wissen, ob es sich um ein gültiges Datum handelt?"

Das Problem ist das "3.5" ist ein gültiges Datum betrachtet (und auch eine Dezimalzahl).

Wenn Sie möchten, dass der Dezimaltyp immer "gewinnt" (dh Sie möchten nicht isDateund isDecimalbeides sein)true ), Ihrer Validierung eine Dezimalprüfung hinzu.

Eine Möglichkeit besteht darin, mithilfe der TryParseMethoden (die a zurückgeben, boolwenn eine Zeichenfolge auf den Typ analysiert werden kann, und die einen outParameter auf den konvertierten Wert setzen) zu bestimmen, ob die Zeichenfolge in einen Typ konvertiert werden kann, z.

string val = "3.5";

// temp variables to hold parsed values
DateTime tmpDate;
decimal tmpDec;
int tmpInt;

var isDecimal = decimal.TryParse(val, out tmpDec);
var isInteger = int.TryParse(val, out tmpInt);

// When checking if it's a DateTime, make sure it's not also a decimal
var isDate = !isDecimal && DateTime.TryParse(val, out tmpDate);
Rufus L.
quelle
Ich hatte es bereits versucht, aber 3.5 ist ein gültiges Datum und eine gültige Dezimalstelle, daher hilft es überhaupt nicht.
Munawar
1
Im obigen Code isDateliegt es falsedaran, dass es eine Prüfung für enthält isDecimal. Haben Sie nicht darum gebeten?
Rufus L
2
@ Munawar - "3.5 ist ein gültiges Datum und eine gültige Dezimalstelle" genau. Wenn wir als Menschen mit dieser Zeichenfolge und keinem anderen Kontext konfrontiert werden, wissen wir nicht, ob es sich um ein Datum, eine Dezimalstelle oder etwas anderes handeln sollte . Sie können nicht erwarten, dass ein Computer auf magische Weise eine Antwort darauf erhält.
Damien_The_Unbeliever
Ja, diese Antwort ist spezifisch für das Problem und behebt mein Problem, obwohl ParseExact am besten passt, wenn Formate bekannt sind.
Munawar
Sie haben immer noch das Problem, wenn das Datumsformat "12122019" ist
Athanasios Kataras
6

Überprüf den offizielle Dokumentation zu ParseExact

Wenn Sie die genaue Darstellung kennen, können Sie Folgendes tun:

  format = "ddd dd MMM yyyy h:mm tt zzz";
  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 Sie es nicht wissen, dann bleiben Sie bei den kulturellen Konvektionen

Analysieren Sie eine Datums- und Zeitzeichenfolge unter Verwendung der Konventionen einer bestimmten Kultur. Überladung von Parse (String, IFormatProvider) (siehe Parsing und kulturelle Konventionen)

Athanasios Kataras
quelle
Das Format ist nicht bekannt. Es kann je nach Benutzereinstellungen beliebig sein.
Munawar
1
@ Munawar Wie werden Sie in dieser Situation zwischen dem 03.01.2019 und dem 01.03.2019 unterscheiden?
Blaise
@Athanasios, Anwendung wird für verschiedene Regionen und Daten verwendet, die verschlüsselt gespeichert werden. Da der Benutzer möglicherweise die Datumsformate ändert, möchte er sich nicht mit der Anwendung eines bestimmten Formats herumschlagen, obwohl ParseExact am besten geeignet ist, wenn das Format bekannt ist.
Munawar