Valori decimali riconosciuti come DateTime anziché restituire false da DateTime.Parse


9

Ho bisogno di eseguire un controllo basato su un valore di stringa se è una data o decimale ma l'analisi della data restituisce sempre vero per i decimali.

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

Restituisce una data valida 3/5/2019.

Come convalidare la stringa per sapere che è una data valida quando il formato della data non è noto?


6
Verifica prima i decimali? Oppure usa DateTime.ParseExactse sai quali formati può / dovrebbe prendere
A Friend il

3
È possibile utilizzare TryParseExacte specificare formati di data validi.
1919

5
In effetti, DateTime.Parseprova più schemi. Se vuoi solo riconoscerne di specifici, prova ad analizzarli in modo specifico.
Jon Skeet,

Risposte:


3

"Come convalidare la stringa per sapere che è una data valida?"

Il problema è che "3.5" è considerata una data valida (e anche un decimale).

Se si desidera che il tipo decimale "vinca" sempre (ovvero che non si desidera isDatee isDecimalsia entrambi true), includere un controllo decimale nella convalida.

Un modo per farlo è utilizzare i TryParsemetodi (che restituiscono a boolse una stringa può essere analizzata al tipo e che imposta un outparametro sul valore convertito) per determinare se la stringa può essere convertita in un tipo, ad esempio:

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);

Avevo già provato, ma 3.5 è una data valida e un decimale valido, quindi non aiuta affatto.
Munawar,

1
Nel codice sopra, isDateè falseperché include un controllo per isDecimal. Non è quello che stavi chiedendo?
Rufus L

2
@Munawar - "3.5 è una data valida e un decimale valido" esattamente. Se noi, come umani, ci viene presentata quella stringa e nessun altro contesto, non sappiamo se si intendesse che fosse una data, un decimale o qualcos'altro . Non puoi aspettarti che un computer ottenga magicamente una risposta.
Damien_The_Unbeliever,

Sì, questa risposta è specifica del problema e risolve il mio problema, anche se ParseExact si adatta meglio se i formati sono noti.
Munawar,

Avrai ancora il problema quando il formato della data è "12122019"
Athanasios Kataras,

6

Controlla la documentazione ufficiale su ParseExact

Se conosci l'esatta rappresentazione puoi fare qualcosa del genere:

  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);
  }

Se non lo sai, allora sei bloccato con le convinzioni culturali

Analizzare una stringa di data e ora utilizzando le convenzioni di una cultura specifica. Sovraccarico di Parse (String, IFormatProvider) (vedere Convenzioni di analisi e cultura)


Il formato non è noto, può essere qualsiasi in base alle preferenze dell'utente.
Munawar,

1
@Munawar come farai a distinguere tra il 1/3/2019 e il 01/03/2019 in quella situazione?
Blaise,

@Athanasios, l'applicazione viene utilizzata per diverse regioni e date memorizzate crittografate. poiché, l'utente può modificare i formati della data, quindi non si desidera fare confusione con l'applicazione di un formato specifico, anche se ParseExact è più adatto se il formato è noto.
Munawar,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.