2010-02-24 4 views
7

Je veux vérifier si une date a un format correct. Il y a de nombreuses possibilités de dates exactes comme:DateTime.TryParse tous les types de dates possibles

  • 02.08.2010
  • 2.8.2010
  • 02.8.2010 02,08
  • 02.August
  • ...

I peut tester chaque sur avec le code comme ceci:

if (DateTime.TryParse(DateTime.ParseExact(date, "dd.M.", 
           new CultureInfo("sl-SI")).ToString(), out dt)) 

Mais alors je peux avoir 40 instructions if. Est-il possible de vérifier toutes les dates avec une instruction if ou une boucle?

Mise à jour:

Sur la base des réponses à ce jour, je teste ce code, mais je un autre problème. Que faire si je viens de 9,2 9.2.2010 pas alors ce code ne fonctionnera pas:

CultureInfo ci = CultureInfo.GetCultureInfo("sl-SI"); 
string[] fmts = ci.DateTimeFormat.GetAllDateTimePatterns(); 

if (DateTime.TryParseExact(date, fmts, ci, DateTimeStyles.AssumeLocal, out dt)) 
{ 
    DateTime = Convert.ToDateTime(date); 
    Check = true; 
} 

Dois-je ajouter manuellement cette fois ou que puis-je faire?

+0

Comment accepter tous les formats de date possibles comme entrée valide? –

+0

s'il vous plaît ajouter des mises à jour à votre question ou utiliser la fonction de commentaires. Aussi s'il vous plaît ne pas utiliser les réponses pour dire merci, utiliser un commentaire ou mieux, upvote et marquer comme accepté: http://blog.stackoverflow.com/2011/01/how-to-say-thanks-in-an-answer/ – Kev

+0

Peut-être que vous voulez voir ceci aussi [robust-datetime-parser-library-for-net] (http://stackoverflow.com/questions/7297622/robust-datetime-parser-library-for-net) – nawfal

Répondre

8

Vous pouvez utiliser quelque chose comme ce qui suit, mais sachez que plus d'un format peut être en mesure d'analyser la même date. Par exemple, le 10/11/12 peut être analysé sous la forme aa/MM/jj ou MM/jj/aa, qui sont tous les deux des formats de date US valides. MM/jj/aa est plus commun, donc il apparaît en premier dans la liste et est celui retourné par le code ci-dessous (si vous l'utilisez avec une culture américaine au lieu de la culture dans l'exemple).

string testValue = "10.11.12"; 

DateTime result; 
CultureInfo ci = CultureInfo.GetCultureInfo("sl-SI"); 
string[] fmts = ci.DateTimeFormat.GetAllDateTimePatterns(); 
Console.WriteLine(String.Join("\r\n", fmts)); 
if (DateTime.TryParseExact(testValue, fmts, ci, 
    DateTimeStyles.AssumeLocal, out result)) 
{ 
    Console.WriteLine(result.ToLongDateString()); 
} 
+3

Dans le une partie du monde où je vis, les humains l'analyseraient comme "jj.mm.aa". Tenant compte de cela, toute la question n'a pas beaucoup de sens, car elle est sujette à de mauvaises interprétations. –

9

Oui ParseExact peut prendre une liste de formats à vérifier.

var formats = new[] { "M.d.yyyy", "dd.MM.yyyy" }; 
var dateValue = DateTime.ParseExact(
    dateString, formats, new CultureInfo("sl-SI"), DateTimeStyles.None); 
Questions connexes