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 :

Bug sur une date donnée [PHP 5.0]


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 38
    Points : 28
    Points
    28
    Par défaut Bug sur une date donnée
    Bonjour,

    J'aimerai faire une boucle pour qu'à partir d'une date, il me rajoute un mois à cette date jusqu'à une date donnée.

    Voici ma boucle pour être un peu plus clair :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    for($time = strtotime("2007-01-01");$time<=strtotime("2011-06-01");$time += ( mktime(0,0,0,2,0,0) - mktime(0,0,0,1,0,0))) {
     
    	$dateT = date("Y-m-01",$time);
     
    	echo "<br />".$dateT;
    }
    Résultats:
    2007-01-01
    2007-02-01
    2007-03-01
    2007-04-01
    2007-05-01
    2007-06-01
    2007-07-01
    2007-08-01
    2007-09-01
    ....
    2011-02-01
    2011-03-01
    2011-05-01
    2011-06-01
    Lorsque vous exécuter cette boucle vous pouvez voir dans résultats qu'il ajoute un mois à chaque fois mais à la fin pour le mois d'avril 2011, il n'est pas passé dedans.

    Je ne comprends vraiment pas pourquoi....

    Avez vous une solution à ce problème ?

    Merci

  2. #2
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Hello

    Tu peux sûrement t'amuser à jouer avec strtotime:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $time = time();
     
    for ($i = 0; $i < 5; $i++) {
      echo "<p>" . date('d M Y', strtotime("+$i month", $time)) . '</p>';
    }

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 38
    Points : 28
    Points
    28
    Par défaut
    Hello,

    Oui mais j'aimerai tester à partir à une date donnée jusqu'à une autre date.

    Ma date de départ est 2007-01-01 et ma date de fin est la date aujourd'hui.

    J'aimerai qu'à partir de 2007-01-01 il m'incrémente d'un mois à chaque fois jusqu'à aujourd'hui... Car en fait dans la boucle je fais d'autre traitement...

    J'espere que j'ai été clair.

    C'est pour ca que je ne comprends pas pourquoi il ne passe pas dans avril avec le code que j'ai fait..

    Merci

  4. #4
    Membre averti Avatar de Nheo_
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 323
    Points : 416
    Points
    416
    Par défaut
    Bonjour,

    Je viens d'essayer ta fonction, et j'avoue que ça me surprend, j'ai fais quelques tests et voilà ce que j'ai remarqué :

    - La fonction saute le mois d'avril au bout de la 4ème année
    - Si je mets des dates inférieures à 2010 => tout marche

    Serait-ce possible qu'il y ait un soucis avec la fonction ? Car au niveau du code je vois vraiment pas ... surtout que ça marche pour certaines dates.

  5. #5
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Le code initial se base sur mktime(0,0,0,2,0,0) ; ca n'a aucun sens.

    Pour le code de Benjamin, les "+1 month" sont piégés : 31 janvier + 1 month = 3 mai
    Par contre en partant du 1er du mois, le problème ne se pose pas.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2005
    Messages : 60
    Points : 58
    Points
    58
    Par défaut
    Salut

    Ca ne fonctionne pas parce que tu ajoutes une durée fixe à chaque itération de ta boucle. Le problème c'est qu'un mois n'a pas une durée fixe. Il va falloir que tu fasses une boucle sur le numéro du mois et sur l'année avec vérification : Quand $mois>12, $mois=1 et $annee++;

  7. #7
    Membre averti Avatar de Nheo_
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 323
    Points : 416
    Points
    416
    Par défaut
    Citation Envoyé par Nious99 Voir le message
    Salut

    Ca ne fonctionne pas parce que tu ajoutes une durée fixe à chaque itération de ta boucle. Le problème c'est qu'un mois n'a pas une durée fixe. Il va falloir que tu fasses une boucle sur le numéro du mois et sur l'année avec vérification : Quand $mois>12, $mois=1 et $annee++;
    C'est pas faux, mais pourquoi ça marche avec certaines dates (<2000, j'ai pas vu un seul soucis) ? Si ça venait des jours / mois plus cours on obtiendrait le soucis sur toutes les dates à intervalles réguliers.

  8. #8
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 228
    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 228
    Points : 8 487
    Points
    8 487
    Billets dans le blog
    17
    Par défaut
    Ne jamais utiliser mktime( ) (d'abord la fonction est illisible ), préférer strtotime( ) qui est vraiment... magique.
    Avec next month on passe d'une certaine date à la même date du mois suivant sans avoir à s'occuper du nbre de jours de chaque mois.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $base = strtotime('2007-01-01') ;
    for ( $i = 0 ; $i < 60 ; $i++ ) {
        echo date('d/m/Y H:i:s', $base), ' +1 mois = ' ;
        $base = strtotime('next month', $base) ;
        echo date('d/m/Y H:i:s', $base), '<br>' ;
    }
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    01/01/2007 00:00:00 +1 mois = 01/02/2007 00:00:00
    01/02/2007 00:00:00 +1 mois = 01/03/2007 00:00:00
    01/03/2007 00:00:00 +1 mois = 01/04/2007 00:00:00
    01/04/2007 00:00:00 +1 mois = 01/05/2007 00:00:00
    01/05/2007 00:00:00 +1 mois = 01/06/2007 00:00:00
    01/06/2007 00:00:00 +1 mois = 01/07/2007 00:00:00
    01/07/2007 00:00:00 +1 mois = 01/08/2007 00:00:00
    01/08/2007 00:00:00 +1 mois = 01/09/2007 00:00:00
    01/09/2007 00:00:00 +1 mois = 01/10/2007 00:00:00
    01/10/2007 00:00:00 +1 mois = 01/11/2007 00:00:00
    01/11/2007 00:00:00 +1 mois = 01/12/2007 00:00:00
    01/12/2007 00:00:00 +1 mois = 01/01/2008 00:00:00
    01/01/2008 00:00:00 +1 mois = 01/02/2008 00:00:00
    01/02/2008 00:00:00 +1 mois = 01/03/2008 00:00:00
    01/03/2008 00:00:00 +1 mois = 01/04/2008 00:00:00
    01/04/2008 00:00:00 +1 mois = 01/05/2008 00:00:00
    01/05/2008 00:00:00 +1 mois = 01/06/2008 00:00:00
    01/06/2008 00:00:00 +1 mois = 01/07/2008 00:00:00
    01/07/2008 00:00:00 +1 mois = 01/08/2008 00:00:00
    01/08/2008 00:00:00 +1 mois = 01/09/2008 00:00:00
    01/09/2008 00:00:00 +1 mois = 01/10/2008 00:00:00
    01/10/2008 00:00:00 +1 mois = 01/11/2008 00:00:00
    01/11/2008 00:00:00 +1 mois = 01/12/2008 00:00:00
    01/12/2008 00:00:00 +1 mois = 01/01/2009 00:00:00
    01/01/2009 00:00:00 +1 mois = 01/02/2009 00:00:00
    01/02/2009 00:00:00 +1 mois = 01/03/2009 00:00:00
    01/03/2009 00:00:00 +1 mois = 01/04/2009 00:00:00
    01/04/2009 00:00:00 +1 mois = 01/05/2009 00:00:00
    01/05/2009 00:00:00 +1 mois = 01/06/2009 00:00:00
    01/06/2009 00:00:00 +1 mois = 01/07/2009 00:00:00
    01/07/2009 00:00:00 +1 mois = 01/08/2009 00:00:00
    01/08/2009 00:00:00 +1 mois = 01/09/2009 00:00:00
    01/09/2009 00:00:00 +1 mois = 01/10/2009 00:00:00
    01/10/2009 00:00:00 +1 mois = 01/11/2009 00:00:00
    01/11/2009 00:00:00 +1 mois = 01/12/2009 00:00:00
    01/12/2009 00:00:00 +1 mois = 01/01/2010 00:00:00
    01/01/2010 00:00:00 +1 mois = 01/02/2010 00:00:00
    01/02/2010 00:00:00 +1 mois = 01/03/2010 00:00:00
    01/03/2010 00:00:00 +1 mois = 01/04/2010 00:00:00
    01/04/2010 00:00:00 +1 mois = 01/05/2010 00:00:00
    01/05/2010 00:00:00 +1 mois = 01/06/2010 00:00:00
    01/06/2010 00:00:00 +1 mois = 01/07/2010 00:00:00
    01/07/2010 00:00:00 +1 mois = 01/08/2010 00:00:00
    01/08/2010 00:00:00 +1 mois = 01/09/2010 00:00:00
    01/09/2010 00:00:00 +1 mois = 01/10/2010 00:00:00
    01/10/2010 00:00:00 +1 mois = 01/11/2010 00:00:00
    01/11/2010 00:00:00 +1 mois = 01/12/2010 00:00:00
    01/12/2010 00:00:00 +1 mois = 01/01/2011 00:00:00
    01/01/2011 00:00:00 +1 mois = 01/02/2011 00:00:00
    01/02/2011 00:00:00 +1 mois = 01/03/2011 00:00:00
    01/03/2011 00:00:00 +1 mois = 01/04/2011 00:00:00
    01/04/2011 00:00:00 +1 mois = 01/05/2011 00:00:00
    01/05/2011 00:00:00 +1 mois = 01/06/2011 00:00:00
    01/06/2011 00:00:00 +1 mois = 01/07/2011 00:00:00
    01/07/2011 00:00:00 +1 mois = 01/08/2011 00:00:00
    01/08/2011 00:00:00 +1 mois = 01/09/2011 00:00:00
    01/09/2011 00:00:00 +1 mois = 01/10/2011 00:00:00
    01/10/2011 00:00:00 +1 mois = 01/11/2011 00:00:00
    01/11/2011 00:00:00 +1 mois = 01/12/2011 00:00:00
    01/12/2011 00:00:00 +1 mois = 01/01/2012 00:00:00

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2005
    Messages : 60
    Points : 58
    Points
    58
    Par défaut
    Tiens, je ne connaissais pas next month, effectivement ça règle tous les problèmes

  10. #10
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    C'est pas faux, mais pourquoi ça marche avec certaines dates (<2000, j'ai pas vu un seul soucis) ? Si ça venait des jours / mois plus cours on obtiendrait le soucis sur toutes les dates à intervalles réguliers.
    Parce que les mois alternent, sauf 2 fois par an (décembre-janvier et juillet-aout) auquel il faut ajouter un décalage supplémentaire tous les 4 ans.
    Il faut cumuler 31 jours de décalage pour que l'anomalie se matérialise.

    effectivement ça règle tous les problèmes
    "Next month" fait la même chose que "+1 month" et pose le même problème.
    "next month" du 31 janvier c'est le 3 mars.

  11. #11
    Membre averti Avatar de Nheo_
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 323
    Points : 416
    Points
    416
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Parce que les mois alternent, sauf 2 fois par an (décembre-janvier et juillet-aout) auquel il faut ajouter un décalage supplémentaire tous les 4 ans.
    Ok j'ai compris. Lors des tests j'ai juste regardé que le mois d'avril soit la, mais en regardant à nouveau, il y a un décalage : un mois n'apparaît pas après plusieurs années (pas forcement avril) . Je me coucherai moins bête ce soir.

  12. #12
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    En adaptant le code que je t'ai filé à ton cas, ça donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    $time1 = $current_time = strtotime("2007-01-01");
    $time2 = strtotime("2011-06-01");
     
    $i = 1;
    while ($current_time < $time2) {
      echo date('d/m/Y', $current_time) . '<br />';
      $current_time = strtotime("+$i months", $time1);
      $i++;
    }
    Pour le code de Benjamin, les "+1 month" sont piégés : 31 janvier + 1 month = 3 mai
    Je m'en rappelais plus, oubliez ce que je viens de faire...

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 38
    Points : 28
    Points
    28
    Par défaut
    Avez vous un bout de code pour régler ce problème par hasard ?

    Merci

  14. #14
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    En tenant compte de la remarque de Sabotage, ceci devrait être juste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $time1 = strtotime("2007-01-01");
    $time2 = strtotime("2011-06-01");
     
    $i = 1;
    while ($time1 < $time2) {
      echo date('d/m/Y', $time1) . '<br />';
      $time1 = strtotime("next month", $time1);
      $i++;
    }

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

Discussions similaires

  1. Bugs sur les Dates sur une base de données MySQL
    Par sheepo dans le forum MySQL
    Réponses: 8
    Dernier message: 19/05/2015, 18h21
  2. Afficher des données sur une date à venir
    Par Martial2 dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 29/05/2014, 21h42
  3. Réponses: 5
    Dernier message: 18/10/2011, 15h51
  4. Réponses: 4
    Dernier message: 16/09/2003, 10h51
  5. Rendre le curseur invisible sur une fenêtre donnée
    Par Meuhmeuh dans le forum C++Builder
    Réponses: 3
    Dernier message: 22/11/2002, 12h25

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