2010-06-21 6 views
1

Dans mon application, l'utilisateur peut spécifier le modèle pour les dates en le saisissant dans la zone de texte. Ce modèle est utilisé pour la consignation des messages. Par exemple, si l'utilisateur spécifie « dd-MM » puis dans le fichier journal, il pouvait voir ce qui suit:C#. Validation du modèle de date

[12-06] Some message... 
[02-09] Some message 2... 

Comment valider ce modèle? Comment protéger l'entrée de mauvais modèles?

+0

Donc, vous savez que c'est la date. Vous voulez vous assurer qu'il est conforme au modèle de date? – Rake36

+0

Si c'est au début d'un mois, comment pourriez-vous faire la différence entre 'dd-MM' et' MM-dd'. Ou peut-être y a-t-il beaucoup de messages aujourd'hui, donc ça devrait être chaque minute donc c'est "hh-mm"? –

+1

Considérant le commentaire par ho1, et votre problème. Je vous suggère de fournir une liste d'options à l'utilisateur au lieu d'analyser le texte entré. –

Répondre

3

La manière la plus simple est d'essayer simplement d'analyser la date.

DateTime someDate; 

// Valid will be false if it could not parse the date 
bool valid = DateTime.TryParse(yourFormat, out someDate); 
+0

Je voudrais ajouter, si vous avez besoin de valider sur le navigateur client, utilisez simplement une expression régulière. – Nordes

+0

DateTime.TryParse() nécessite une représentation sous forme de chaîne d'une date ou d'une heure en tant que premier argument (pas un modèle pour un). Il ne veut pas "dd-MM" car le PO est fourni; il veut "12-06" que l'OP essaye de produire. – gap

0

Les expressions régulières seront probablement un bon choix.

0

Ceci est un problème difficile. J'ai essayé:

try 
{ 
    DateTime.Now.ToString(tmpFormatSpec);      
} 
catch (Exception) 
{ 
    // the format spec is known to be bad 
} 

Le problème est que les modèles de format de date sont SO flexibles. Même les choses qui ne rendent pas les informations de date sont autorisés (et ne sont pas détectés par mon exemple de code):

DateTime.Now.ToString("bla"); // no exception raised 

Voir cette other SO post pour une meilleure façon (je ne l'ai pas encore essayé).

Voir aussi cette discussion sur le problème, avec les commentaires de J. Skeet.

0

Ceci est un problème difficile. J'ai essayé:

try 
{ 
    DateTime.Now.ToString(tmpFormatSpec);      
} 
catch (Exception) 
{ 
    // the format spec is known to be bad 
} 

Le problème est que les modèles de format de date sont SO flexibles. Même les choses qui ne rendent pas les informations de date sont autorisés (et ne sont pas détectés par mon exemple de code):

DateTime.Now.ToString("bla"); // no exception raised 

Voir cette other SO post pour une meilleure façon (je ne l'ai pas encore essayé).

Voir aussi discussion à propos du problème, avec des commentaires de J. Skeet.