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 :

[Dates] [PHP 4.3.10] alternative à mktime()


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Octobre 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 124
    Points : 120
    Points
    120
    Par défaut [Dates] [PHP 4.3.10] alternative à mktime()
    Bonjour,

    Dans un script, je souhaiterais comparer une date D1 (jj/mm/aaaa) à la date du jour D2. Pour cela, j'utilise les fonctions mktime() et time() (voir code ci-dessous) mais la fonction mktime me génére un Warning lorsque la date D1 est antérieure au 1 janvier 1970 !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mktime(0, 0, 0, $mois, $jour, $annee) > time()
    Connaissez vous une alternative à mktime() et time() pour comparer deux dates ?

    merci d'avance.

  2. #2
    Membre confirmé Avatar de mathieugamin
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 572
    Points : 627
    Points
    627
    Par défaut
    Salut
    Dois-tu forcément récupérer un timestamp UNIX?

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Octobre 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 124
    Points : 120
    Points
    120
    Par défaut
    non, la finalité de mon test est de vérifier qu'une date saisie est :
    - valide
    - antérieure à la date du jour

    J'ai utilisé mktime() et time() car c'est à mon sens la solution la plus efficace pour effectuer des deux tests mais cela ne fonctionne pas avec les date antérieure au 1 janvier 1970 en PHP 4.3.10 (ca fonctionne en PHP 5.xx mais le serveur n'est pas en PHP 5.xx )

  4. #4
    Membre confirmé Avatar de mathieugamin
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 572
    Points : 627
    Points
    627
    Par défaut
    Dans ce cas, tu peux faire la comparaison à chaque variable.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <?php
    if(
      $jour < date('d') && 
      $mois <= date('m') && 
      $annee <=date('Y')
    ){
      echo 'La date est valide et antérieure à la date actuelle';
    }
    else{
      echo 'La date n\'est pas valide ou n\'est pas antérieure à la date actuelle';
    }
    ?>

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Octobre 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 124
    Points : 120
    Points
    120
    Par défaut
    hum... ton code permet dans certaines confirgurations de date de vérifier l'antériorité mais pas la validité.

    essaie de faire tourner ton algo aujourd'hui (17/04/2007) avec la date du 21/04/2000... ca ne fonctionne pas car 21 > 17

    Vérifier l'antériorité pourrait se faire comme ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ok = false;
    if($annee < date('Y')) {
      ok = true;
    } else if($annee == date ('Y') && $mois < date('m')) {
      ok = true;
    } else if($mois == date('m') && $jour <= date('d')) {
      ok = true;
    }
    ok == true ? 'date antérieure ou égale' : 'date supérieure';
    mais vérifier la validité d'une date est beaucoup plus galère à cause des années bisextiles

  6. #6
    Membre éclairé Avatar de Korko Fain
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    632
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 632
    Points : 718
    Points
    718
    Par défaut
    Checkdate ?
    http://www.php.net/manual/fr/function.checkdate.php

    Apres, te suffit de faire un calcul :
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    // Format de $date1 et $date2 : jj/mm/aaaa
    // Valeurs de retour :
    // 1 si $date1 > $date2
    // 0 si $date1 = $date2
    // -1 si $date1 < $date2
    // NULL si erreur
    function compareDates($date1, $date2)
    {
    	if( !preg_match('^([0-9]{2})\/([0-9]{2})\/([0-9]{4})$, $date1, $match1) || !preg_match('^([0-9]{2})\/([0-9]{2})\/([0-9]{4})$, $date2, $match2) )
    	{
    		return NULL;
    	}
     
    	$jj1 = $match1[1];
    	$mm1 = $match1[2];
    	$aaaa1 = $match1[3];
     
    	$jj2 = $match2[1];
    	$mm2 = $match2[2];
    	$aaaa2 = $match2[3];
     
    	if( $aaaa1 < $aaaa2 )
    		return -1;
    	else if( $aaaa1 > $aaaa2 )
    		return 1;
     
    	if( $mm1 < $mm2 )
    		return -1;
    	else if( $mm1 > $mm2 )
    		return 1;
     
    	if( $jj1 < $jj2 )
    		return -1;
    	else if( $jj1 > $jj2 )
    		return 1;
     
    	return 0;
    }

  7. #7
    Membre confirmé Avatar de mathieugamin
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 572
    Points : 627
    Points
    627
    Par défaut
    essaie de faire tourner ton algo aujourd'hui (17/04/2007) avec la date du 21/04/2000... ca ne fonctionne pas car 21 > 17
    C'est pourtant ce que j'ai compris que tu voulais dans ton message :
    non, la finalité de mon test est de vérifier qu'une date saisie est :
    - valide
    - antérieure à la date du jour
    ???

  8. #8
    Membre régulier
    Homme Profil pro
    Inscrit en
    Octobre 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 124
    Points : 120
    Points
    120
    Par défaut
    Citation Envoyé par mathieugamin
    C'est pourtant ce que j'ai compris que tu voulais dans ton message :


    ???
    Tout à fait, mais le 21/04/2000 est bien antérieur à la date du jour (17/04/2007) mais n'est pas considéré comme antérieur et valide dans ton algo

  9. #9
    Membre éclairé Avatar de Korko Fain
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    632
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 632
    Points : 718
    Points
    718
    Par défaut
    Ya pas que ça lol ton script fonctionne pas mathieugamin :

    01/01/1970 < 02/02/1971 Ok
    02/02/1970 < 01/01/1971 Erreur ton script dit que c'est faux ^^

    De plus,
    Je crois pas que ça fonctionne ^^

  10. #10
    Membre régulier
    Homme Profil pro
    Inscrit en
    Octobre 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 124
    Points : 120
    Points
    120
    Par défaut
    @Korko Fain
    merci pour la fonction, a priori, je n'ai pas d'autre choix que de faire l'ensemble des tests moi-même

    @mathieugamin
    Dans ton algo, il faut que tu dissocies les tests sur le jour, le mois et l'année si tu veux que ca fonctionne pour l'antériorité. Pour la validité je pense que la fonction checkdate de Korko Fain est la meilleure solution.

  11. #11
    Membre confirmé Avatar de mathieugamin
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 572
    Points : 627
    Points
    627
    Par défaut

    Oui, je vais aller faire la sieste là !

    Je ne devrais pas faire 3 choses en même temps....

    Excuses plates à la populasse ! je n'arrive même plus à lire les dates...

  12. #12
    Membre confirmé Avatar de mathieugamin
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 572
    Points : 627
    Points
    627
    Par défaut
    Citation Envoyé par bigben99
    Dans ton algo, il faut que tu dissocies les tests sur le jour, le mois et l'année si tu veux que ca fonctionne pour l'antériorité. Pour la validité je pense que la fonction checkdate de Korko Fain est la meilleure solution.
    Oui merci, j'avais bien compris, mais dans la précipitation on handicape souvent plus les gens qu'on ne les aide...
    La prochaine fois, je prendrai le temps ! T'en perdras moins ainsi !

  13. #13
    Membre éclairé Avatar de Korko Fain
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    632
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 632
    Points : 718
    Points
    718
    Par défaut
    Non je crois aussi que comparer 2 dates qui peuvent etre antérieurs au 1 janvier 1970 faut que tu fasse les tests toi meme.

    *Jete des pierres à son collegue développeur* Bouh honte sur toi :p

  14. #14
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 060
    Points : 1 357
    Points
    1 357
    Par défaut
    Et ça ne peut pas suffire ?
    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
     
    $d1 = '18/04/1950';
    list($jour, $mois, $annee) = explode('/', $d1);
    $msg = (checkdate($mois, $jour, $annee)) ? 'date correcte' : 'date incorrecte';
    echo $msg . '<br>';
     
    $d1 = $annee . $mois . $jour;
    $d2 = date('Ymd');
     
    if ($d2 > $d1)
    {
    	$msg = 'd2 > d1';
    }
    elseif ($d2 < $d1)
    {
    	$msg = 'd2 < d1';
    }
    else
    {
    	$msg = 'd2 = d1';
    }
    echo $msg . '<br>';

  15. #15
    Membre régulier
    Homme Profil pro
    Inscrit en
    Octobre 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 124
    Points : 120
    Points
    120
    Par défaut
    merci à tous les deux

    @mathieugamin pas de soucis, ca arrive parfois de se tromper et puis ca aide aussi à bien analyser ses algo

    voici donc au final ma fonction ca peut toujours servir à d'autres :
    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
    function compareDates($date1, $date2) {
      list($jour1, $mois1, $annee1) = split("/", $date1, 3);
      list($jour2, $mois2, $annee2) = split("/", $date2, 3);
      if(!is_numeric($jour1) || !is_numeric($mois1) || !is_numeric($annee1) || !is_numeric($jour2) || !is_numeric($mois2) || !is_numeric($annee2)) return false;
      if(!checkdate($mois1, $jour1, $annee1) || !checkdate($mois2, $jour2, $annee2)) return false;
      if($annee1 < $annee2) {
        return -1;
      } else if($annee1 > $annee2) {
        return 1;
      }
      if($mois1 < $mois2) {
        return -1;
      } else if($mois1 > $mois2) {
        return 1;
      }
      if($jour1 < $jour2) {
        return -1;
      } else if($jour1 > $jour2) {
        return 1;
      }
      return 0;
    }
    compareDate($date1; $date2) renvoie :
    * false : si une des deux dates n'est pas valide
    * -1 si $date1 < $date2
    * 0 si $date1 = $date2
    * 1 si $date1 > $date2

  16. #16
    Membre éclairé Avatar de Korko Fain
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    632
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 632
    Points : 718
    Points
    718
    Par défaut
    Je dirais meme plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $date2 = date('d/m/Y');
    ^^

  17. #17
    Membre confirmé Avatar de mathieugamin
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 572
    Points : 627
    Points
    627
    Par défaut
    @mathieugamin pas de soucis, ca arrive parfois de se tromper et puis ca aide aussi à bien analyser ses algo

    Merci,
    le ridicule ne tue pas et quand on est jeune papa, les erreurs fusent !

    Bon développement !

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

Discussions similaires

  1. [Dates] probleme date php
    Par flydragon dans le forum Langage
    Réponses: 11
    Dernier message: 04/05/2006, 17h56
  2. [Dates] [php]Test de dates
    Par samjung dans le forum Langage
    Réponses: 4
    Dernier message: 26/04/2006, 17h00
  3. [Dates] [PHP/HTML/WEB] - Afficher le nom du jour dans la date
    Par fredhali2000 dans le forum Langage
    Réponses: 14
    Dernier message: 26/01/2006, 11h13
  4. VB/EXCEL/DATES/PHP
    Par JBLCN dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 05/08/2005, 08h32

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