jour dédoublé dans un calendrier

Petit nouveau ! | 5 Messages

21 oct. 2008, 17:06

Bonjour,

Je construit une application sous forme de calendrier, et il y a quelque chose qui m'échappe.

Dans l'entête du calendrier que j'ai construit, j'affiche les jours du mois (L,M,M,J,V,S,D).
Pour cela, j'effectue une boucle. Mais son résultat ne fonctionne pas toujours, et il m'affiche sur certains mois des jours en double. Par exemple pour ce mois-ci, il y a une semaine à 2 Dimanches, ce qui serait par ailleurs plutôt sympa :lol: ... mais qui provoque un décalage gênant pour l'appli. :(

En simplifiant un peu mon code, voici une boucle qui reproduit le problème :
$dateCur = $dateDeb; //$dateDeb correspond au premier jour du mois

for($i = 1; $i <= $intNbJoursDansMois; $i++) { //$intNbJoursDansMois : nombre de jour dans le mois concerné

      echo $dateCur.' - '.date("Y-m-d", $dateCur).'<br />';

      $dateCur = $dateDeb + ($i * 86400);

}
et voici le résultat que j'obtiens :
(le problème se situe au niveau du 26)

Code : Tout sélectionner

1222812000 - 2008-10-01 1222898400 - 2008-10-02 1222984800 - 2008-10-03 1223071200 - 2008-10-04 1223157600 - 2008-10-05 1223244000 - 2008-10-06 1223330400 - 2008-10-07 1223416800 - 2008-10-08 1223503200 - 2008-10-09 1223589600 - 2008-10-10 1223676000 - 2008-10-11 1223762400 - 2008-10-12 1223848800 - 2008-10-13 1223935200 - 2008-10-14 1224021600 - 2008-10-15 1224108000 - 2008-10-16 1224194400 - 2008-10-17 1224280800 - 2008-10-18 1224367200 - 2008-10-19 1224453600 - 2008-10-20 1224540000 - 2008-10-21 1224626400 - 2008-10-22 1224712800 - 2008-10-23 1224799200 - 2008-10-24 1224885600 - 2008-10-25 1224972000 - 2008-10-26 1225058400 - 2008-10-26 1225144800 - 2008-10-27 1225231200 - 2008-10-28 1225317600 - 2008-10-29 1225404000 - 2008-10-30
La valeur de la variable semble correctement s'incrémenter, pourtant quand j'utilise la fonction date,
je retrouve mon résultat bizarre qui faisait que les 26 et 27 Octobre 2008 sont tous les deux des dimanches ...

Est-ce un bug PHP ? (j'ai la 5.1.4)

Si quelqu'un a une explication, je suis preneur...

Merci.

ViPHP
ViPHP | 2287 Messages

21 oct. 2008, 17:32

Bonjour,

Apparemment tu passes d'un jour au suivant en ajoutant un nombre constant de secondes sans te poser plus de questions que ça. Très bien... Mais et l'heure d'hiver alors, tu y as pensé ? :-)

C'est pourtant écrit dans la page de manuel de la fonction date() :
Il est possible d'utiliser date() et mktime() ensemble pour générer des dates dans le futur ou dans le passé.

Note: Cette méthode est plus sûre que simplement ajouter ou retrancher le nombre de secondes dans une journée ou un mois à un timestamp, à cause des heures d'hiver et d'été.
Tu peux vérifier ça en affichant simplement l'heure à côté de la date produite par ton script, ce qui donne :

1222812000 - 2008-10-01 00:00:00
1222898400 - 2008-10-02 00:00:00
1222984800 - 2008-10-03 00:00:00
1223071200 - 2008-10-04 00:00:00
1223157600 - 2008-10-05 00:00:00
1223244000 - 2008-10-06 00:00:00
1223330400 - 2008-10-07 00:00:00
1223416800 - 2008-10-08 00:00:00
1223503200 - 2008-10-09 00:00:00
1223589600 - 2008-10-10 00:00:00
1223676000 - 2008-10-11 00:00:00
1223762400 - 2008-10-12 00:00:00
1223848800 - 2008-10-13 00:00:00
1223935200 - 2008-10-14 00:00:00
1224021600 - 2008-10-15 00:00:00
1224108000 - 2008-10-16 00:00:00
1224194400 - 2008-10-17 00:00:00
1224280800 - 2008-10-18 00:00:00
1224367200 - 2008-10-19 00:00:00
1224453600 - 2008-10-20 00:00:00
1224540000 - 2008-10-21 00:00:00
1224626400 - 2008-10-22 00:00:00
1224712800 - 2008-10-23 00:00:00
1224799200 - 2008-10-24 00:00:00
1224885600 - 2008-10-25 00:00:00
1224972000 - 2008-10-26 00:00:00
1225058400 - 2008-10-26 23:00:00

1225144800 - 2008-10-27 23:00:00
1225231200 - 2008-10-28 23:00:00
1225317600 - 2008-10-29 23:00:00
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Petit nouveau ! | 5 Messages

21 oct. 2008, 19:22

Oups !

Merci beaucoup ! je me sens un peu bête sur le coup ... :oops:
$dateDeb = date("U", mktime(2,0,0,date($mois), 1, date($annee)));
où $mois et $annee sont récupérées en paramètres résoud cette affaire.

J'ai pas fait le rapprochement avec le changement d'heure. Cela dit, je ne savais pas qu'on passait à l'heure d'hiver en Octobre ... et puis la première fois que j'ai remarqué ce bug c'était sur un Jeudi qui était dédoublé, à ma connaissance on ne fait pas de changement d'heure un Jeudi, mais ça devait provenir d'un autre bug qui a été corrigé entre temps ...

Mais bon, j'ai toujours été fâché avec les dates de toute manière, surtout lorsqu'il s'agit de les extraire ou faire rentrer dans une base de données ... Mais c'est une autre histoire.

Merci encore ! Je pense que c'est résolu ... :P