Valeurs décimales reconnues comme DateTime au lieu de renvoyer false depuis DateTime.Parse

9

J'ai besoin d'effectuer une vérification basée sur une valeur de chaîne, que ce soit une date ou une décimale, mais l'analyse de date renvoie toujours vrai pour la décimale.

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

Il renvoie une date valide 3/5/2019.

Comment valider une chaîne pour connaître sa date valide lorsque le format de date n'est pas connu?

Munawar
la source
6
Vérifiez d'abord la décimale? Ou utilisez DateTime.ParseExactsi vous savez quels formats il peut / devrait prendre
Un ami
3
Vous pouvez utiliser TryParseExactet spécifier des formats de date valides.
juharr
5
En effet - DateTime.Parseessaie plusieurs modèles. Si vous ne souhaitez en reconnaître que certains, essayez de les analyser spécifiquement.
Jon Skeet
1
Est-ce que cela répond à votre question? Vérifiez si une chaîne est une date valide à l'aide de DateTime.TryParse
Joost K

Réponses:

3

"Comment valider une chaîne pour connaître sa date de validité?"

Le problème est que cela "3.5" est considéré comme une date valide (et aussi une décimale).

Si vous voulez que le type décimal gagne toujours (c'est-à-dire que vous ne voulez pas isDateet que isDecimalles deux le soient true), incluez une vérification décimale dans votre validation.

Une façon de le faire consiste à utiliser les TryParseméthodes (qui renvoient un boolsi une chaîne peut être analysée dans le type, et qui définit un outparamètre sur la valeur convertie) pour déterminer si la chaîne peut être convertie en un type, par exemple:

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
la source
J'avais déjà essayé mais 3,5 est une date valide et une décimale valide donc ça n'aide pas du tout.
Munawar
1
Dans le code ci-dessus, isDatec'est falseparce qu'il comprend une vérification isDecimal. N'est-ce pas ce que vous demandiez?
Rufus L
2
@Munawar - "3.5 est une date valide et une décimale valide" exactement. Si nous, en tant qu'êtres humains, sommes présentés avec cette chaîne et aucun autre contexte, nous ne savons pas si elle était destinée à être une date, une décimale ou quelque chose d'autre possible . Vous ne pouvez pas vous attendre à ce qu'un ordinateur y réponde comme par magie.
Damien_The_Unbeliever
Oui, cette réponse est spécifique au problème et résout mon problème bien que ParseExact convienne mieux si les formats sont connus.
Munawar
Vous avez toujours le problème lorsque le format de date est "12122019"
Athanasios Kataras
6

Consultez la documentation officielle sur ParseExact

Si vous connaissez la représentation exacte, vous pouvez faire quelque chose comme ceci:

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

Si vous ne le savez pas, alors vous êtes coincé avec les convictions culturelles

Analysez une chaîne de date et d'heure en utilisant les conventions d'une culture spécifique. Surcharge d'analyse (String, IFormatProvider) (voir Analyse et conventions culturelles)

Athanasios Kataras
la source
Le format n'est pas connu, il peut être basé sur les préférences de l'utilisateur.
Munawar
1
@Munawar comment allez-vous distinguer entre le 1/3/2019 et le 3/1/2019 dans cette situation?
Blaise
@Athanasios, l'application est utilisée pour différentes régions et dates stockées cryptées. car, l'utilisateur peut changer les formats de date, donc ne voulez pas jouer avec l'application d'un format spécifique, bien que ParseExact soit le mieux adapté si le format est connu.
Munawar