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 :

strtotime : bug en incrémentation


Sujet :

Langage PHP

  1. #1
    Membre chevronné
    Homme Profil pro
    Webmaster
    Inscrit en
    Janvier 2007
    Messages
    489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Janvier 2007
    Messages : 489
    Par défaut strtotime : bug en incrémentation
    Bonjour,
    J'ai besoin de créer un échéancier, j'utilise strtotime dans une boucle et là surprise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $i = '1';
    $i2= '4';
    while($i != $i2) 
    { 
    $newdate=date('Y-m-25', strtotime('+'.$i.' month'));
    echo "$i - $newdate <br>";
    $i++;
    }
    retourne :

    1 - 2015-03-25
    2 - 2015-03-25
    3 - 2015-04-25
    Pourquoi strtotime +1 et +2 mois renvoient 2015-03-25 ?

    J'ai fait boulette ?

    Merci à vous

  2. #2
    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
    Par défaut
    Parce qu'il n'y a pas de 29 février.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    $i = '1';
    $i2= '4';
    $date = date_create('first day of this month');
    for ($i = 1; $i < $i2; $i++) {
    	$date->modify('+ 1 month');
    	echo $i . ' - ' . $date->format('Y-m-25') . '<br/>';
    }
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre chevronné
    Homme Profil pro
    Webmaster
    Inscrit en
    Janvier 2007
    Messages
    489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Janvier 2007
    Messages : 489
    Par défaut
    Merci à toi !

    Oui j'y ai pensé mais justement la date déclarée était le 25

  4. #4
    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
    Par défaut
    Tu n'as pas déclaré la date le 25, tu as affiché 25 à la place du jour réel.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre chevronné
    Homme Profil pro
    Webmaster
    Inscrit en
    Janvier 2007
    Messages
    489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Janvier 2007
    Messages : 489
    Par défaut
    Ok merci donc d'un façon générale cette fonction est à proscrire quand il y a des mois en 28 jours.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $i = '1';
    $i2= '4';
    $date = date_create('first day of this month');
    for ($i = 1; $i < $i2; $i++) {
    	$date->modify('+ 1 month');
    	$date = $date->format('Y-m-25');
    	echo $date.'<br>';
    }
    Je suis désolé là je suis au point mort j'ai
    Fatal error: Call to a member function modify() on a non-object in [ligne : $date->modify('+ 1 month');]
    Google n'est pas mon ami

  6. #6
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 699
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 699
    Par défaut
    tu écrase l'objet date avec le résultat de ta méthode à cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	$date = $date->format('Y-m-25');
    utilise 2 variables différentes, tu verras la différence

  7. #7
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    ou affiche directement sans toucher à $date:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for ($i = 1; $i < $i2; $i++) {
    	$date->modify('+ 1 month');
    	echo $date->format('Y-m-D') . '<br>';
    }

  8. #8
    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
    Par défaut
    cette fonction est à proscrire quand il y a des mois en 28 jours.
    C'est plutôt la notion d'ajouter un mois qui devrait être proscrite ; un mois n'étant pas une durée fixe, ajouter des mois est un chausse-trappe.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

Discussions similaires

  1. Incrémentation d'un champ float qui bug
    Par Dev@lone dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 08/02/2008, 18h41

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