Bonjour,

J'ai un formulaire dans mon application qui possède un champs caché avec comme valeur time(). Lorsque le formulaire est soumis, je crée une nouvelle variable time(), puis je fais la différence entre le deux pour connaitre le temps approximatif de réponse à mon formulaire.

Je pense que l'idée est assez clair.

Cependant j'ai un problème que je n'arrive pas à régler évidemment (ça peut pas juste marcher du premier coup...).

J'affiche le résultat grâce à un date("H:i:s", $diff) qui me renvoit la différence sous la forme xx:xx:xx mais toujours avec une heure de plus sur mon serveur dédié. Ca marchait bien en local.

Je comprends bien que le problème se situe au niveau des fuseaux horaires. J'ai donc changé dans le php.ini de mon serveur dédié la timezone pour mettre "Europe/Paris". L'heure de mon serveur et de php indiquent bien la bonne heure. Mais les deux variables time() affichent toujours une différence de +1.

Je me dis que je vais voir la configuration en local. Et là surprise, le timezone par défaut est UTC. En le changeant en "Europe/Paris", là je me retrouve avec le même problème que sur mon dédié.

Donc ma question, avez-vous une idée de pourquoi les deux variables créées de la même façon (avec un time()) ne se font pas sur le même fuseau horaire ? Savez-vous comment corriger le problème ?

Je sais que certains vont me proposer de faire des opérations sur les variables créées ou changer le timezone en UTC dans le php.ini. Mais ces solutions ne me conviennent pas car je récupère dans mon application des dates avec les heures lorsque les internautes font certaines actions. Si je change le fuseau horaire, je risque de récupérer des heures décalées 6 mois par an. De plus, faire des opérations sur les time() m'obligerait à mettre à jour mon application à chaque changement d'heure.

J'espère que j'ai bien défini le problème et que quelqu'un a déjà rencontré un problème similaire.

Merci pour votre aide.

4 réponses


extrarox
Réponse acceptée

Salut,

Essaye avec gmdate au lieu de date.

oula date('..',$diff) c'est une mauvaise idée ça te donne une date par rapport au timestamp et non pas une conversion $diff => en durée

Utilise plutôt les objets DateTime qui te permettrons de récupérer plus facilement la différence entre 2 dates (et sans pb de TimeZone)

cayoul
Auteur

Merci pour ta réponse tout d'abord.

J'ai essayé ce que tu m'as dis, mais vu que je ne peux pas passer un objet en champs caché, je suis obligé de faire un $datetime->getTimestamp ce qui revient à faire un time() au final. C'est juste plus lours à mettre en place avec l'instanciation des objets et la récupération des timestamps.

En fait, en faisant toute une série de débug, j'ai constaté que mon problème ne venait pas de là car la différence entre mes deux time() est bonne. J'ai le bon nombre de secondes. Par contre c'est dans la restitution de cette différence qu'est le problème.

En effet, j'utilise la fonction date en faisant un date("H:i:s", $diff). Les minutes et secondes s'affichent bien, mais les heures affichent toujours +1.

Des idées ?

J'ai essayé de mettre en place une fonction qui traite ma $diff pour me la mettre sous le format hh:mm:ss mais ça ralentit le traitement...

cayoul
Auteur

Merci extrarox. Ta solution marche nikel!

Pour info: gmdate() est identique à la fonction date(), hormis le fait que le temps retourné est GMT