Précédent   Forum des professionnels en informatique > PHP > Langage > Fonctions
Fonctions Forum d'entraide sur les fonctions PHP. Avant de poster -> FAQ fonctions et Sources diverses
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/05/2011, 15h46   #1
Invité régulier
 
Inscription : juillet 2005
Messages : 36
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 36
Points : 5
Points : 5
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 :
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;
}
Citation:
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
rich25200 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2011, 15h58   #2
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
Hello

Tu peux sûrement t'amuser à jouer avec strtotime:
Code :
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>';
}
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 11/05/2011, 09h41   #3
Invité régulier
 
Inscription : juillet 2005
Messages : 36
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 36
Points : 5
Points : 5
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
rich25200 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2011, 09h55   #4
Membre éprouvé
 
Avatar de Nheo_
 
Homme
Étudiant
Inscription : avril 2011
Messages : 317
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2011
Messages : 317
Points : 405
Points : 405
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.
Nheo_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2011, 09h55   #5
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
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.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2011, 09h58   #6
Membre du Club
 
Inscription : juin 2005
Messages : 60
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : juin 2005
Messages : 60
Points : 40
Points : 40
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++;
Nious99 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2011, 10h02   #7
Membre éprouvé
 
Avatar de Nheo_
 
Homme
Étudiant
Inscription : avril 2011
Messages : 317
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2011
Messages : 317
Points : 405
Points : 405
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.
Nheo_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2011, 10h09   #8
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 823
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

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

Informations forums :
Inscription : mars 2005
Messages : 2 823
Points : 3 449
Points : 3 449
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 :
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 :
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
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2011, 10h22   #9
Membre du Club
 
Inscription : juin 2005
Messages : 60
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : juin 2005
Messages : 60
Points : 40
Points : 40
Tiens, je ne connaissais pas next month, effectivement ça règle tous les problèmes
Nious99 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2011, 10h42   #10
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Citation:
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.

Citation:
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.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2011, 11h06   #11
Membre éprouvé
 
Avatar de Nheo_
 
Homme
Étudiant
Inscription : avril 2011
Messages : 317
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2011
Messages : 317
Points : 405
Points : 405
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.
Nheo_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2011, 11h27   #12
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
En adaptant le code que je t'ai filé à ton cas, ça donne:
Code :
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++;
}
Citation:
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...
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 11/05/2011, 14h08   #13
Invité régulier
 
Inscription : juillet 2005
Messages : 36
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 36
Points : 5
Points : 5
Avez vous un bout de code pour régler ce problème par hasard ?

Merci
rich25200 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2011, 14h29   #14
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
En tenant compte de la remarque de Sabotage, ceci devrait être juste:
Code :
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++;
}
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 01
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h22.


 
 
 
 
Partenaires

Hébergement Web