Accueil > > > VALIDATION D'UNE DATE ENTRE LE 01/01/1600 ET 31/12/2699) AVEC UNE EXPRESSION RÉGULIÈRE EN C#. LA VALIDATION TIENT COMPTE DES ANNÉES BISSEXTILES
VALIDATION D'UNE DATE ENTRE LE 01/01/1600 ET 31/12/2699) AVEC UNE EXPRESSION RÉGULIÈRE EN C#. LA VALIDATION TIENT COMPTE DES ANNÉES BISSEXTILES
Information sur la source
Description
Expression réguliere en C# pour vérifier une date sous la forme dd/mm/ssyy. Les dates peuvent être comprise en 01/01/1600 et 31/12/2699 L'expression régulière tient compte des années bissextiles 1700, 1800, 1900, 2100, 2200, 2300, 2500, 2600 Les dates peuvent avoir ou non un séparateur (25/2/60 ou 250260) 3 goupes (dd, mm, ssyy) sont renvoyés si la date est valide dd = jour mm = mois ssyy année Le plus de l'expression régulière, c'est que le format de la date , n'est pas fixe comme avec un DateTime.ParseExact. Par exemple, les dates 250260, 25:2:1960, 1-2-60 sont accpetées. Pour valider une date saisie à l'écran, c'est beaucoup plus simple
Source
- ...
- // expresionn régulière pour les dates sous la forme dd/mm/ssyy
- // c'est la seule ligne utile pour la validation.
- // utilisation:
- // if (regexDate.Match("25/2/60").Success == true)
- // {
- // // code si la date est OK
- // }
- // else
- // {
- // // code si la date est KO
- //}
- //
- System.Text.RegularExpressions.Regex regexDate = new System.Text.RegularExpressions.Regex(@"^((((?<dd>([012]?\d)|(3[01]))[\-/.: ]?)(?<mm>(0?[13578])|(1[02]))|((?<dd>([012]?\d)|30)[\-/.: ]?)(?<mm>(0?[469])|11))[\-/.: ]?(?<ssyy>(1[6-9]|2[0-6])?\d\d)|(?<dd>([01]?\d)|(2[0-8]))[\-/.: ]?(?<mm>0?2)[\-/.: ]?(?<ssyy>(1[6-9]|2[0-6])?\d\d)|(?<dd>29)[\-/.: ]?(?<mm>0?2)[\-/.: ]?(?<ssyy>((16|20|24)?(([13579][26])|([02468][048]))|((1[789]|2[12356])?(([13579][26])|([2468][048])|(0[48]))))))$");
-
- // *********************************************************************************
- // Génération de date et test
- // *********************************************************************************
-
- // match pour tester la validitée et recupérer les groupes (dd, mm, ssyyy)
- System.Text.RegularExpressions.Match matchDate;
-
- // jours 'spéciaux' pour les test des dates
- Int16[] dayArray = new Int16[] { 1, 28, 29, 30, 31 };
-
- // date pour les tests
- String date;
-
- // tous les 100 ans depuis 1600 jusqu'à 2600
- for (Int16 yy = 1600, counter = 0; yy <= 2600; yy += 100)
- {
- // tous les mois
- for (Int16 mm = 1; mm <= 12; mm++)
- {
- // tous les jours 'spéciaux'
- for (Int16 dd = 0; dd < dayArray.Length; dd++)
- {
- // une fois sur 2 format la date avec des zeros (01/01/2025)
- if ((++counter & 1) == 1)
- {
- date = String.Format("{0}/{1}/{2}", dayArray[dd], mm, yy);
- }
- else
- {
- date = String.Format("{0:D2}/{1:D2}/{2:D4}", dayArray[dd], mm, yy);
- }
-
- matchDate = regexDate.Match(date);
- if (matchDate.Success == true)
- {
- // date OK formatée à partir des groupes
- System.Console.WriteLine("OK - {0:D3} {1}-{2}-{3}", counter, matchDate.Groups["dd"].Value, matchDate.Groups["mm"].Value, matchDate.Groups["ssyy"].Value);
- }
- else
- {
- // date en erreur
- System.Console.WriteLine(" {0:D3} {1} <-- KO", counter, date);
- }
- }
- }
- }
- ...
...
// expresionn régulière pour les dates sous la forme dd/mm/ssyy
// c'est la seule ligne utile pour la validation.
// utilisation:
// if (regexDate.Match("25/2/60").Success == true)
// {
// // code si la date est OK
// }
// else
// {
// // code si la date est KO
//}
//
System.Text.RegularExpressions.Regex regexDate = new System.Text.RegularExpressions.Regex(@"^((((?<dd>([012]?\d)|(3[01]))[\-/.: ]?)(?<mm>(0?[13578])|(1[02]))|((?<dd>([012]?\d)|30)[\-/.: ]?)(?<mm>(0?[469])|11))[\-/.: ]?(?<ssyy>(1[6-9]|2[0-6])?\d\d)|(?<dd>([01]?\d)|(2[0-8]))[\-/.: ]?(?<mm>0?2)[\-/.: ]?(?<ssyy>(1[6-9]|2[0-6])?\d\d)|(?<dd>29)[\-/.: ]?(?<mm>0?2)[\-/.: ]?(?<ssyy>((16|20|24)?(([13579][26])|([02468][048]))|((1[789]|2[12356])?(([13579][26])|([2468][048])|(0[48]))))))$");
// *********************************************************************************
// Génération de date et test
// *********************************************************************************
// match pour tester la validitée et recupérer les groupes (dd, mm, ssyyy)
System.Text.RegularExpressions.Match matchDate;
// jours 'spéciaux' pour les test des dates
Int16[] dayArray = new Int16[] { 1, 28, 29, 30, 31 };
// date pour les tests
String date;
// tous les 100 ans depuis 1600 jusqu'à 2600
for (Int16 yy = 1600, counter = 0; yy <= 2600; yy += 100)
{
// tous les mois
for (Int16 mm = 1; mm <= 12; mm++)
{
// tous les jours 'spéciaux'
for (Int16 dd = 0; dd < dayArray.Length; dd++)
{
// une fois sur 2 format la date avec des zeros (01/01/2025)
if ((++counter & 1) == 1)
{
date = String.Format("{0}/{1}/{2}", dayArray[dd], mm, yy);
}
else
{
date = String.Format("{0:D2}/{1:D2}/{2:D4}", dayArray[dd], mm, yy);
}
matchDate = regexDate.Match(date);
if (matchDate.Success == true)
{
// date OK formatée à partir des groupes
System.Console.WriteLine("OK - {0:D3} {1}-{2}-{3}", counter, matchDate.Groups["dd"].Value, matchDate.Groups["mm"].Value, matchDate.Groups["ssyy"].Value);
}
else
{
// date en erreur
System.Console.WriteLine(" {0:D3} {1} <-- KO", counter, date);
}
}
}
}
...
Conclusion
C'est vraiment super les expression régulières... Une ligne pour la validation et 40 pour tester si l'expression régulière fonction.
Historique
- 16 mai 2012 11:15:04 :
- Erreur dans la description 31/21/2699 devient 31/12/2699
- 16 mai 2012 11:27:05 :
- Quelques erreurs dans les commentaires du code
- 16 mai 2012 11:39:20 :
- Ajout de commentaire dans le code
- 16 mai 2012 11:53:50 :
- Justification de l'utilisation d'une Regex
- 22 mai 2012 15:57:52 :
- Ajout d'une application de test
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
SQ Help... [ par NICKO02 ]
J'essaie de creer un generateur de requettes en SQl a partir d'une table definie seulement :Si j'envoies ce type de requette : SELECT * FROM rec WHERE
Le type Date [ par gg00xiv ]
Bonjour,Existe t-il un type Date en C# ? si oui, dans quel namespace peut-on le trouver ?Merci
Horloge et date ? [ par JCpp ]
Je voudrai connaître les fonctions pour afficher l'heure et la date en C#Merci à tous,http://perso.wanadoo.fr/iar/IAr_Projet.htm
caster un string en long [ par seb35 ]
Bonjour,J'aimerais savoir s'il est possible de caster un string en long car je lis en C# des cellules d'un fichier excel et qd je recois la valeur d'u
Quelle est la date ? [ par bigflo ]
Salut,J'ai une date mais en fait c'est le nombre de secondes depuis le 1er Janvier 1970.Comment faire pour la convertir en date actuelle au format hh:
format de date dans un datagrid [ par Kalypswoo ]
Bonjour tout le monde, voila alors j'ai une requête d'insertion contenant une date avec une bbd access.J'affiche les résultats dans un datagrid le pro
Format DateTime [ par Gabberzorus ]
Salut, Voila je voudrais recupérer une date dans un DateTimePicker et la comparer à une date de ma bd Access via une requete.La date dans Access est a
Pb de date [ par fdouieb ]
Bonjour,Je possede une variable string contenant en principe une date.Avant de convertir cette derniere en datetime je me dois de verifier si le conte
récupération du résumé d'un fichier image [ par LeGnuff ]
Bonjour j'aurai aimé savoir s'il y a un moyen en C# de récupérer les informations stockées dans un fichier image sous Windows XP (dans Propriétés =>
Colorier une ligne d'un datagrid [ par Gabberzorus ]
Je sais qu'il y a deja eu un post la dessus mais moi je voudrais savoir si il y a moyen de mettre une ligne NON SELECTIONNEE dans une certaine couleur
|
Derniers Blogs
SIMULER FACILEMENT L'ENVOI DE MAILSIMULER FACILEMENT L'ENVOI DE MAIL par JeremyJeanson
il m'a été demandé, à plusieurs reprises, comment je faisais pour simuler l'envoi de mail lors de mes démos de Workflow Foundation. Ma solution est plutôt simple : j'utilise la configuration par défaut du SmtpClient et j'oriente les mails vers un dossier ...
Cliquez pour lire la suite de l'article par JeremyJeanson VOTEZ POUR LE TOP 10 DES INFLUENCEURS SHAREPOINT FRANCOPHONES !VOTEZ POUR LE TOP 10 DES INFLUENCEURS SHAREPOINT FRANCOPHONES ! par Patrick Guimonet
Si ce n'est déjà fait (comme plus de 600 personnes déjà), il est encore temps de voter pour le concours TOP 10 des influenceurs SharePoint francophones ! Il est organisé par harmon.ie et accessible ici : http://harmon.ie/top-...
Cliquez pour lire la suite de l'article par Patrick Guimonet [CONF'SHAREPOINT] DERNIER RAPPEL ! :-)[CONF'SHAREPOINT] DERNIER RAPPEL ! :-) par Patrick Guimonet
La Conf'SharePoint en chiffres c'est : 3 jours de SharePoint ! 4 parcours et 60 sessions 17 partenaires représentant toutes les fac...
Cliquez pour lire la suite de l'article par Patrick Guimonet [ #SHAREPOINT 2013 ] LES MODèLES DE SITES STANDARDS.[ #SHAREPOINT 2013 ] LES MODèLES DE SITES STANDARDS. par Patrick Guimonet
C'est un point peu mis en avant mais SharePoint 2013 a été l'occasion de remettre de l'ordre dans les modèles de sites. Tout d'abord, un certain nombre de modèles ont été tout simplement rendus obsolètes (cf. Fonctionnalités déco...
Cliquez pour lire la suite de l'article par Patrick Guimonet
Logiciels
Easy-Planning (4.5.0.11)EASY-PLANNING (4.5.0.11)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté a... Cliquez pour télécharger Easy-Planning CVEasy (3.1.0.51)CVEASY (3.1.0.51)PHMSD-CVEasy est un logiciel d'aide à la rédaction de CV d'une simplicité déconcertante.
PHMSD-C... Cliquez pour télécharger CVEasy LettresFaciles 2011 (8.6.0.31)LETTRESFACILES 2011 (8.6.0.31)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011 sDEVIS-FACTURES vlPRO (8.4.2.62)SDEVIS-FACTURES VLPRO (8.4.2.62)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO Devis-Factures PHMSD (2.1.0.11)DEVIS-FACTURES PHMSD (2.1.0.11)Configuration minimale
Nécessite Windows™ 2000, XP, Windows 7, 8, Vista (Service Pack à... Cliquez pour télécharger Devis-Factures PHMSD
|