Se connecter avec
S'enregistrer | Connectez-vous

Calcul du temps

Dernière réponse : dans Programmation
Expert Programmation

Salut à tous,

J'ai un petit souci avec le calcul de temps en php. J'essaie par ex de calculer l'intervalle de temps séparant les premiers jours à 00:00:00 (hh:mm:ss) entre 2 mois successifs.

Mon idée était la suivante :
  1. //calcul du timestamp du premier jour du premier mois à 00:00:00 avec "mktime"
  2. $timestampMoisActuel = mktime(0, 0, 0, 4, 1, 2006); // 1er avril 2006
  3. $nbJourDansLeMois=30; // nombre de jour en avril
  4. $timestampMoisSuivant = $timestampMoisActuel + $nbJourDansLeMois*24*60*60; // le timestamp du début du mois suivant est égal au timestamp du début du mois actuel + la durée en seconde du mois actuel
  5. echo date('d/m/Y à H:i', $timestampMoisSuivant ); //affiche la date calculée


Et ça marche pour de nombreux mois, mais pas pour tous : en octobre où il manque 1 heure (on arrive à la fin du mois calculé au 31/10/2006 à 23:00) et en mars où il y a 1 heure de trop (on arrive à la fin du mois calculé au 01/04/2006 à 01:00)...

Y a-t-il une explication logique à ce phénomène ?

Merci d'avance :) 

Autres pages sur : calcul temps

Lassé par la pub ? Créez un compte
Expert Programmation

Logique Oui. Tu ne calcules pas avec des dates absolues mais avec des dates relatives. Il faudrait que tu utilises pour ton calcul, le temps GMT et non pas le GMT+1 CES (je suppose), quitte à faire des conversions en entré et en sortie de ton algo. Comment faire ? Ca je ne sais pas.
Expert Programmation

Merci Zeb pour cette réponse, mais j'ai pas tout compris. C'est quoi le temps absolu ? Parce que pour moi le temps est toujours relatif à un point de départ de donné... Du coup je ne vois pas trop ce que tu veux dire :) 
Expert Programmation

En effet, le souci du décalage a disparu avec gmdate(). Le problème, c'est que le temps n'est plus à l'heure française... C'est normal, puisqu'on est GMT+1 en hiver et GMT+2 en été ! C'est simple :/ 

Bref, c'est là que j'ai compris d'où venait le décalage d'une heure en avril et en octobre ! C'est justement lié au changement de d'heure :) 

Une solution simple pour remédier à ce décalage sur les calculs de périodes en heure française :
  1. if($moisActuel == "3") // mars, on passe à l'heure d'été
  2. $moisSuivant = $moisActuel + $nbJourMoisActuel*3600*24 - 3600; //début avril= début mars + nombre de secondes réelles en mars (avec une heure en moins pour le passage à l'heure d'été)
  3. elseif($moisActuel == "10") //octobre, on passe à l'heure d'hiver
  4. $moisSuivant = $moisActuel + $nbJourMoisActuel*3600*24 + 3600; //début octobre = début septembre + nombre de secondes réelles en septembre (avec une heure en plus pour le passage à l'heure d'été)
  5. else
  6. $anneeMois = $anneeMois + $nbJourMoisActuel*3600*24;

Ce script n'est pas parfait puisqu'il ne tient pas compte de la date réelle du changement d'heure, c'est à dire entre le samedi et le dimanche des derniers WE de mars et d'octobre... Il y a donc quelques jours à la fin de mars et à la fin d'octobre qui seront encore décalés d'une heure. Mais pour ce dont j'ai besoin, pas besoin d'aller plus loin pour le moment. Si ça vous tente de le faire, ne vous gênez pas :D 
Expert Programmation

Ben apparemment, gmstrftime() (et strftime() ) prend bien en compte le fuseau horaire, mais pas le changement d'heure... Y compris en l'associant avec la fonction setlocale()

Je ne vois pas quoi faire d'autres. Ca vient peut être du paramétrage de EasyPhp ? Mais c'est pareil chez Free.
Lassé par la pub ? Créez un compte