begin process at 2013 05 23 04:45:49
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Date / Heure

 > 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

Note :
Aucune note
Catégorie :Date / Heure Source .NET ( DotNet ) Classé sous :date, bissextile, expression régulière, regular expression Niveau :Débutant Date de création :16/05/2012 Date de mise à jour :22/05/2012 15:57:52 Vu / téléchargé :2 780 / 100

Auteur : witre

Ecrire un message privé
Commentaire sur cette source (3)
Ajouter un commentaire et/ou une note

 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.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 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

Source avec Zip Source avec une capture Source .NET (Dotnet) TEXTBOX AVEC LABEL INCORPORÉ

 Sources de la même categorie

Source avec Zip Source avec une capture Source .NET (Dotnet) STOPWATCHCHRONOMETRE par eagleleader
Source avec Zip Source avec une capture Source .NET (Dotnet) AGECALCULATOR par eagleleader
Source avec Zip Source .NET (Dotnet) CALCUL DATES & JOURS FÉRIÉS par DCTC33
Source avec Zip Source avec une capture Source .NET (Dotnet) DIFFÉRENCE DE TEMPS, XML, POCKETPC / WINFORMS...... par Steph115
Source avec Zip Source avec une capture Source .NET (Dotnet) HORLOGE/ALARME NUMÉRIQUE par Bio3G

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture Source .NET (Dotnet) AGECALCULATOR par eagleleader
Source avec Zip Source avec une capture Source .NET (Dotnet) ALTERNATIVE AUX EXPRESSIONS RÉGULIÈRES .NET : ANYPARSER par olivieram2
Source avec Zip Source avec une capture Source .NET (Dotnet) GETSYSTEMTIME ET SETSYSTEMTIME par Arnotic
Source avec Zip Source .NET (Dotnet) DATE EN TOUTE LETTRE (ARABE) par moi2007
Source .NET (Dotnet) CLASSE DATE AVEC QUELQUES FONCTIONS par ricklekebekoi

Commentaires et avis

Commentaire de Alain Proviste le 16/05/2012 18:53:47 administrateur CS

imbuvable :(

Commentaire de Alain Proviste le 16/05/2012 23:25:33 administrateur CS

salut,

'imbuvable' est peut être un peu sévère...

je pense que ça irait mieux si tu détaillais comment tu as construit ton expression régulière. (ta source d'info pour la construire)


tu pourrais aussi mettre quelques test sur des dates un peu particulières aussi pour voir qu'elle marche bien. par exemple en comparant avec le comparant avec le comportement du datetime du framework.

ceci dit ce code fait surement le boulot, donc pas de problème !

Commentaire de witre le 22/05/2012 15:34:58

Pour les infos sur les années bisextilles, allez voir le site http://support.microsoft.com/kb/214019/fr

L'xpression régulière traite 4 types de date
1 les dates 'normales'
2 les dates pour le mois de février 'normal'
3 les dates pour le mois de février bisextille
4 les siclès spéciaux

pour les dates 'normales' c'est relativement simple:
°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
- les mois 1, 3, 5, 7, 8, 10, 13 ont 31 jours
- les mois 4, 6, 9, 11 ont 30 jours

pour les dates pour le mois de février 'normal':
°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
- le mois de février 'normal' à 28 jours


pour les dates pour le mois de février bisextille:
°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
les années bisextilles dans un siècle sont:
00, 04, 08, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80, 84, 88, 92, 96.
Si on regarde les derniers chiffres, il y a 0, 4, 8, 2, 6.
A partir de là, on peut faire deux groupes
0, 4, 8 et 2, 6
Les siècles bisextilles commence donc par 0 ou  2 ou  4 ou  6 ou  8 suivies de 0 ou 4 ou 8. Les autres années bisextilles commencent par 1 ou 3 ou 5 ou 7 ou 9 suivi de 2 ou 6.
Ce qui se traduit en expression régulière par ([2468][048])|([13579][26])

pour les siclès spéciaux:
°°°°°°°°°°°°°°°°°°°°°°°°°
Mais il faut tenir compte des sièclès spéciaux (1700, 1800, 1900, 2100, 2200, 2300, 2500, 2600) qui ne sont pas bisextilles car  ils ne sont pas divisible par 400.
Ce qui se traduit en expression régulière par (1[6-9]|2[0-6)\d\d

L'application de demo teste les dates entre le 01/01/1900 et 31/12/2999 pour 100 ans pour les jours  1, 28, 29, 30, 31.

 Ajouter un commentaire


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 =&gt 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


Nos sponsors


Sondage...

CalendriCode

Mai 2013
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,123 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales