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] nombre de mois entre deux dates


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 201
    Points : 97
    Points
    97
    Par défaut [Dates] nombre de mois entre deux dates
    Bonjour,

    J'ai un souci qui commence à me prendre la tête....

    Je souhaite calculer le nombre de mois entre deux date (si superieur à 6 alors ok sinon ko)

    Pour l'instant j'en suis arrivé là :
    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
     
    $aa_today=date('Y');
       $mm_today=date('n');
       $jj_today=date('j');
       $today=mktime(0, 0, 0, $mm_today,$jj_today, $aa_today);
     
       $datesaisie=$enreg_recup['datesaisie'];//récupère une date depuis une requete au format 'aaaa-mm-jj'
       $tab_datesaisie=explode("-",$datesaisie);
       $aa_datesaisie=intval($tab_datesaisie[0]);
       $mm_datesaisie=intval($tab_datesaisie[1]);
       $jj_datesaisie=intval($tab_datesaisie[2]);
       $date_test=mktime(0, 0, 0, $mm_datesaisie, $jj_datesaisie, $aa_datesaisie);
     
       $aa_test=date('Y',$date_test);
       $mm_test=date('n',$date_test);
       $jj_test=date('j',$date_test);
     
       $diff_date=$today-$date_test;
       $mm_diff=date('n',$diff_date);
       $aa_diff=$aa_today-$aa_test;
          if(($mm_diff<=6)and($aa_diff<=1))
          {
              echo('dem ko');
          }
          else
          {
              echo('dem ok');
          }
    Mais voilà, je ne récupère pas le résultat voulu. Si les deux dates sont sur une meme annéeou si la différence d'année est supérieur à 1 pas de souci, mais sinon c'est pas bon...

    Quelqu'un aurait-il une idée pour me venir à l'aide?

    Merci

  2. #2
    Membre émérite

    Homme Profil pro
    Expert PHP
    Inscrit en
    Novembre 2004
    Messages
    2 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Expert PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 127
    Points : 2 557
    Points
    2 557
    Par défaut
    moi j'aurai fait différemment :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $date_debut = $timestamp1;
    $date_fin = $timestamp2;
     
    $duree = $date_fin - $date_debut;
    et apres tu sais combien il y a de secondes dans un mois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if ( $duree/$nb_sec_ds_un_mois > 6 )
    {
        echo 'ok';
    }
    else
    {
        echo 'ko';
    }

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 201
    Points : 97
    Points
    97
    Par défaut
    J'y ai pensé, avec un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $date1=mktime(0, 0, 0, 01, 01, 2006);
    $date2=mktime(0, 0, 0, 06, 30, 2006);
    $diff1=$date2-$date1;
    echo($diff1.'<br>');//donne 15548400
    $date3=mktime(0, 0, 0, 06, 01, 2006);
    $date4=mktime(0, 0, 0, 12, 31, 2006);
    $diff2=$date4-$date3;
    echo($diff2);//donne 18406800
    Mais je trouve pas ça tres préci,suivant les mois,année bisextile,etc...

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 194
    Points : 220
    Points
    220
    Par défaut
    je verrais ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    if ($date_saisie > $date_test)
    {
      $date_1 = $date_saisie; 
      $date_2 = $date_test;
    }
    else
    {
      $date_1 = $date_test; 
      $date_2 = $date_saisie;
    }
    $diff_mois = ((int) substr ($date_1, 0, 4) - (int) substr ($date_2, 0, 4)) * 12 + (int) substr ($date_1, 6, 2)) - (int) substr ($date_2, 6, 2);

    enfin sans tenir compte des jours

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 201
    Points : 97
    Points
    97
    Par défaut
    Mais je croi que je vai faire comme tu me le propose car là je m'en sort pas, tant pis pour la précision...

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 201
    Points : 97
    Points
    97
    Par défaut
    Par contre si quelqu'un voit où se trouve le problème dans ma fonction je veux bien qu'il me tienne au courant, parcque je pense ne pas être trop loin du bon résultat. Le problème vient sans doute du test if, il doit manquer un petit truc...

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 194
    Points : 220
    Points
    220
    Par défaut
    le problème se situe à la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     $mm_diff=date('n',$diff_date);
    cette ligne te donne le mois correspondant à la date exprimé timestamp (secondes écoulées depuis le 1er janvier 1970) alors que pour toi $diff_date est un interval.
    la fonctionnalité n'est pas celle que tu veux.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 201
    Points : 97
    Points
    97
    Par défaut
    effectivement c'est ennuyeux...

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 194
    Points : 220
    Points
    220
    Par défaut
    en faisant une petite recherche, j'ai vu que mktime acceptait des valeurs negative, donc le code donnerait ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    $aa_today=date('Y');
    $mm_today=date('n');
    $jj_today=date('j');
    $today_moins_6_mois=date ("Y-m-d", mktime(0, 0, 0, $mm_today-6,$jj_today, $aa_today));
    if ($datesaisie > $today_moins_6_mois)
    {
    // ko
    }
    else
    {
    //ok
    }

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 201
    Points : 97
    Points
    97
    Par défaut
    hey hey!! on y est presque !

    mais par contre si $mm_today=2 par exemple on est d'accord que $mm_today-6=8, mais l'année ne sera pas décrémentée...dommage...

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 201
    Points : 97
    Points
    97
    Par défaut
    Mais en fait j'suis bete, on peu faire un test au préalable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if($mm_today-6<0){$aa_today=$aa_today-1;}
    et là bingo, c'est gagné!...normalelent...

    En tou cas merci beaucoup pour ton aide!

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 194
    Points : 220
    Points
    220
    Par défaut
    Citation Envoyé par Mat_DZ
    hey hey!! on y est presque !

    mais par contre si $mm_today=2 par exemple on est d'accord que $mm_today-6=8, mais l'année ne sera pas décrémentée...dommage...
    t'as pas compris, mktime accepte des valeurs négatives et ajuste le reste en conséquences, fais des tests, tu verras

  13. #13
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Points : 1 565
    Points
    1 565
    Par défaut
    Citation Envoyé par Mat_DZ
    hey hey!! on y est presque !

    mais par contre si $mm_today=2 par exemple on est d'accord que $mm_today-6=8, mais l'année ne sera pas décrémentée...dommage...
    non, $mm_today-6 vaudra -4 ET mktime ajustera l'annee en fonction. mktime sait tres bien gerer ce genre de trucs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo date("d/m/Y", mktime(0,0,0,-1,1,2000));
    devrait afficher 01/12/1999

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 201
    Points : 97
    Points
    97
    Par défaut
    merci pour cette précision

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 201
    Points : 97
    Points
    97
    Par défaut
    J'ai fait tous les test et ça fonctionne nikel.

    Merçi a tous!!

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

Discussions similaires

  1. le nombre de mois entre deux dates
    Par lila23 dans le forum Débuter
    Réponses: 6
    Dernier message: 05/04/2009, 13h43
  2. [SQL] Calcul du nombre de mois entre deux dates
    Par Lolie11 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 09/03/2009, 12h46
  3. Récupérer le nombre de mois entre deux dates
    Par winow dans le forum C++Builder
    Réponses: 2
    Dernier message: 24/08/2008, 00h17
  4. Différence en nombre de mois entre deux dates
    Par seblo_scoqi dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 11/05/2007, 13h26
  5. Nombre de mois entre deux dates
    Par boulaxx dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 14/09/2006, 16h22

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