Gotcha ! Tomorrow never dies.

Répondre
LupusMic
le 22/07/2008 à 21:21
LupusMic
Une fois n'est pas coutume dans le bar, voici le piège à con du mois :-D

Ayant raz la casquette de l'API merdique de PHP concernant le temps, j'ai décidé de me faire des classes propres, avec une interface cohérente et pratique.

Premier jet.

Comme on peut le constater, j'obtenais le lendemain en ajoutant 24 * 60 * 60 secondes.

Mais bizarrement, le 28 octobre 2007 était un jour sans fin...

Celui qui trouvera le pourquoi du comment en moins de deux heures aura mon éternelle admiration smiley
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
LA GLOBULE
le 22/07/2008 à 23:07
LA GLOBULE
Le problème est pourtant simple :)

Le postulat qui dit que l'on passe au lendemain en ajoutant 24 * 60 * 60 secondes au timestamp courant est faux.

En effet, si on s'attarde un peu sur ton script, on voit que l'exécution part en vrille au moment ou le timestamp atteint 1193522400 (soit le 28 octobre 2007).
Au tour suivant, on arrive à un timestamp de 1193608800.
Or, ce timestamp correspond toujours au 28 octobre 2007.

En effet, le 28 octobre 2007, nous étions le dernier dimanche d'octobre. Et le dernier dimanche de tous les mois d'octobre, nous passons en heure d'hiver : on retire 60 minutes à l'heure courante.

PS : tu dois ton éternelle admiration à un collègue : wako ;) (on a réfléchi chacun de notre côté sur ton soucis)
LupusMic
le 23/07/2008 à 00:12
LupusMic
Ah ben bravo ;)

Je ne pouvais pas me rendre compte que le timstamp changeait, puisqu'avant de l'afficher je le recalcule (dans mon constructeur), ce qui fait que je ne le voyais plus bouger.

Ce n'est qu'en cherchant le timestamp dans Google que je suis tombé sur un forum dans lequel on parlait du changement d'heure.

Je vomis désormais sur Benjamin Franklin, et je le vomirais tant que je penserais au changement d'heure.

Bref, j'ai remplacé :
<?php $aday = getdate($this->timestamp + 24 * 60 * 60) ; 
?>

par
<?php $aday = getdate(strtotime("tomorrow", $this->timestamp)) ; ?>


Mais par curiosité, qu'est-ce qui vous a mis sur la piste, toi et ton collègue ?
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
LA GLOBULE
le 23/07/2008 à 00:48
LA GLOBULE
Ben moi, dans le for, j'ai var_dumper $day, et j'ai vu que le timestamp de l'objet ne bougeait plus.
Ensuite, j'ai fais un getdate sur le timestamp précédent, et sur celui ou ca merdait.

Dans les deux cas, ca retournait le 28 octobre, le premier à 0h, le deuxième à 23h.

Moi, chuis resté bloqué la dessus. Je pensais en fait à un bug de getdate.
Et c'est mon pote qui m'a dit "passage à l'heure d'hiver".

Ca parait con quand tu as la solution, mais j'avoue être resté perplexe devant ton code pendant 45mn.
Répondre

Ecrire un message

Votre message vient d'être créé avec succès.
LoadingChargement en cours