IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

validation de date avec 2 formats possibles


Sujet :

Langage PHP

  1. #1
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 385
    Points : 5 733
    Points
    5 733
    Billets dans le blog
    1
    Par défaut validation de date avec 2 formats possibles
    Bonsoir,

    mes dates ont 2 formats possibles :

    dd/mm/yyyy (que des chiffres)

    ou

    mm(textuel) qq, yyyy (donc le mois en textuel et le reste en chiffres)

    Exemples : 26/11/2021

    ou

    Nov 26,2021

    Pour valider une date reçue, j'ai imaginé la fonction suivante :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public function validateDate($date,$the_format='d/m/Y',$the_format2='F d,Y'):bool
        {
            $format = 0;
            $d=DateTime::createFromFormat($the_format,$date);//on crée le DateTime avec le 1er format
            $format = 1; // on mémorise le 1er format
            if ($d== false){
                $d=DateTime::createFromFormat($the_format2,$date); //on crée le DateTime avec le 2e format
                $format = 2;// on mémorise le 2e format
                if ($d== false) return false; // si la date en entrée ne correspond à aucun des 2 formats, on retourne false
            }
            $format = ($format == 1)?$the_format:$the_format2; //on récupère le format de la date en entrée
            $format2 = $d->format($format); //on recrée la date en convertissant le DateTime au format initial
             return $d!==false && $format2===$date; //la date est valide si le DateTime ne vaut pas false et qu'on a pu
            // recréer la date initiale
        }
    Ca ne marche pas car pour Jan 01,2021, ça me retourne falsealors que cette date est conforme au 2e format. Quelle est votre proposition ?
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 101
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 101
    Points : 8 211
    Points
    8 211
    Billets dans le blog
    17
    Par défaut
    Ton script est alambiqué

    Tu veux retourner true si la date est au format "d/m/Y"
    Tu veux retourner true si la date est au format "M d, Y" (M = forme courte du mois, F = forme longue du mois)
    Tous les autres cas doivent retourner false

    Cela donnerait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    <?php
     
    function validate_date($date)
    {
        if (DateTime::createFromFormat('d/m/Y', $date)) {
            return true;
        }
        // F : forme longue Febuary => Février
        // M : forme courte Feb => Février
        if (DateTime::createFromFormat('M d, Y', $date)) {
            return true;
        }
        return false;
    }
     
    $dates = [
        '26/11/2021', // Valide
        '32/11/2021', // Valide, calcul 02/12
        'Feb 20, 2021', // Valide
        'Feb 20,2021', // Valide
        'Jan 01,2021', // Valide
        '20,2021', // Invalide
    ];
     
    foreach ($dates as $date) {
        printf('%s => %s<br>', $date, validate_date($date) ? 'Valide' : 'Invalide');
    }
    Ici ça fonctionne pour "Jan 01,2021".

    Comme tu peux le voir, DateTime::createFromFormat() n'est pas forcément adapté car le 32/11/2021 est converti en 02/12 (30/11 + 2 jours).
    Si besoin regarde du côté de strtotime().
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  3. #3
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 385
    Points : 5 733
    Points
    5 733
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    certes, mon script n'était pas top...En fait, j'étais parti d'un script qui fonctionnait et qu'on m'avait donné sur DVP mais pour un seul format de date et j'avais simplement essayé de l'adapter. Sauf que la doc ne mettant pas les points sur les i :
    F et M Une représentation textuelle du mois, comme January ou Sept
    j'ai retenu "représentation textuelle du mois", ai bien vu qu'il y avait le choix, mais n'en ai pas déduit qu'il y avait forme longue ou courte...

    Ton script est en effet bien plus simple, même si un bug de commentaire (Febuary au lieu de February ) m'a fortement perturbé
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Jointure de dates avec un format différent
    Par alexis trotta dans le forum SQL
    Réponses: 4
    Dernier message: 31/10/2013, 13h46
  2. sélection de date avec un format spécifique
    Par zemzoum89 dans le forum SQL
    Réponses: 2
    Dernier message: 12/07/2013, 16h46
  3. Validation de Date avec DatePicker
    Par houleyh dans le forum VBA Access
    Réponses: 2
    Dernier message: 11/08/2012, 23h48
  4. [Debutant] Afficher une date avec un format short
    Par lilou77 dans le forum BIRT
    Réponses: 12
    Dernier message: 11/01/2007, 09h25
  5. Parser une date avec un format
    Par titoine1978 dans le forum C++
    Réponses: 15
    Dernier message: 03/04/2006, 11h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo