salut tous le monde
je veux voir est ce qu'il existe une fonction qui cacule le nombre des heure entre 2 date
le premiére date est 31/3/2009 a 9h30
le deuxiéme date est 2/3/2009 a 11h30
et merci pour vous
salut tous le monde
je veux voir est ce qu'il existe une fonction qui cacule le nombre des heure entre 2 date
le premiére date est 31/3/2009 a 9h30
le deuxiéme date est 2/3/2009 a 11h30
et merci pour vous
de mémoire il me semble pas qu'il y ai de fonction, mais un petit code rapide et simple te donnera :
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 <?php $date1 = '2009-03-31 09:30:00'; $date2 = '2009-03-02 11:00:00'; $time1 = strtotime($date1); $time2 = strtotime($date2); if( $time1 > $time2 ) { $time = $time1 - $time2; } else { $time = $time2 - $time1; } $time = $time / 3600; echo "Il y a ".round($time)." heures"; ?>
Ta fonction Darkstar ne prend pas en compte le changement d'heures.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 <?php $obj_datedebut = date_create('2009-03-02 11:00:00'); $obj_datefin = date_create('2009-03-31 09:30:00'); $n = 0; for ($datex = clone $obj_datedebut; $datex->format('U') < $obj_datefin->format('U'); $datex->modify('+1 hour')) { $n++; } echo $n . ' heures et ' . round(($obj_datefin->format('U') - ($datex->format('U'))) / 60) . ' minutes'; ?>
Effectivement, j'y avais pas pensé ^^
Ton bout de code est sympa et effectivement, fais comme ça tout est pris en compte
Je le sais parce que je me suis déjà fait avoir
Après il faut voir la précision qu'on cherche, car évidemment la fonction que je propose est a peu pres 1000 fois plus lente.
Donc si c'est juste pour voir un gadget, ou si la periode est inférieur a un an, on peut faire comme tu proposes.
Un participant attentif m'a fait remarqué que ma fonction ne donnait pas de bons résultats.
Effectivement je me suis planté sur mon histoire de minutes restantes, j'ai corrigé.
J'ai de plus refait des tests et strtotime() produit bien des timestamp prenant en compte l'heure d'été/hiver.
Je conseillerais toutefois de bien tester en fonction de la version de php et du serveur car j'avais eu des resultats differents a une époque).
Les résultats restent cependant différents :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 <?php $date1 = '2009-10-25 01:00:00'; $obj_datedebut = date_create($date1); $date = strtotime($date1); for ($i = 0; $i<6; $i++) { echo date('H:i:s',$date) . ' ' . $date . ' ; ' . $obj_datedebut->format('U') . ' ' . $obj_datedebut->format('H:i:s') . '<br>'; $date += 3600; $obj_datedebut->modify('1 hour'); } ?>si quelqu'un veut reprendre la reflexion moi je suis en bouilli.01:00:00 1256425200 ; 1256425200 01:00:00
02:00:00 1256428800 ; 1256432400 02:00:00
02:00:00 1256432400 ; 1256436000 03:00:00
03:00:00 1256436000 ; 1256439600 04:00:00
04:00:00 1256439600 ; 1256443200 05:00:00
05:00:00 1256443200 ; 1256446800 06:00:00
Les heures d'été et d'hiver sont prises en compte par l'objet "DateTime".
Dans les 2 codes qui suivent, j'ai légèrement modifié la date et supprimé les minutes pour la simplicité. Ils utilisent tous deux une période de 28 jours pleins, soit 28 * 24 heures = 672 heures.
Ce premier code donne 671 heures, ce qui est correct puisque la journée du 29 mars ne comportait que 23 heures :
Le second donne 673 heures car la journée du 25 octobre comportera 25 heures :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 <?php $dateDebut = date_create('2009-03-02'); $dateFin = date_create('2009-03-30'); $debut = $dateDebut -> format('U'); $fin = $dateFin -> format('U'); $heure = ($fin - $debut) / 3600; echo $heure . ' heures<br>'; ?>
CQFD.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 <?php $dateDebut = date_create('2009-10-02'); $dateFin = date_create('2009-10-30'); $debut = $dateDebut -> format('U'); $fin = $dateFin -> format('U'); $heure = ($fin - $debut) / 3600; echo $heure . ' heures<br>'; ?>
Mais dans tous les cas, ce code est éminemment plus rapide qu'une boucle.
Il y a quand meme un soucis car si j'ajoute une heure au 25 octobre, 1heure du matin, je suis propulsé au deuxieme 2h du matin alors qu'en réalité ils se sont ecoulé 2h.
A priori, pour un calcul sur une courte période, il semblerait que le problème soit insoluble. Personnellement, je n'ai pas la solution. Si quelqu'un la connait, qu'il parle maintenant, ou se taise à jamais.
D'après Wikipedia :
Pour éviter les malentendus et d’éventuels bogues informatiques, les transporteurs évitent de programmer des départs entre 2 et 3 heures du matin lors du retour à l’heure d’hiver : en raison du décalage d’une heure, il est deux fois 2 heures du matin.
La réponse de php.net :
Pour moi ce comportement n'a aucun sens.Les modificateurs relatives (ie : +1 hour) correspondent a un deplacement sur un horloge et non pas a un deplacement dans le temps réel
Et pourtant, ce code :
affiche :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 <?php $date = new DateTime('2009-03-29 01:00:00'); $date -> modify('+1 hour'); echo $date -> format('Y-m-d H:i:s'); ?>
Ce qui me semble correct.2009-03-29 03:00:00
PS - J'utilise Php 5.2.0
Oui pour ce changement d'heure la, ca colle : il s'est ecoulé une heure et je me retrouve a 3h ; l'heure suivant 1h sur ma pendule c'est 3h.
Pour l'heure d'hiver, le +1 hour va me donner le prochain changement sur ma pendule et donc va ecouler 2h de temps réel.
On le voit bien sur le relevé que j'ai mis plus haut, le +1 hour saute le timestamp 1256428800.
Et celui-ci :
affiche :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 <?php $dateDeb = new DateTime('2009-10-25 01:00:00'); $dateFin = new DateTime('2009-10-25 02:00:00'); echo ($dateFin ->format('U') - $dateDeb ->format('U')) / 3600; ?>
Ce qui me semble tout aussi correct, bien qu'il considère le changement d'heure déjà effectué.
En fait le problème est uniquement sur les modificateurs relatifs.
Si je parcours le temps en faisant +60 sur un timestamp ou +60 second avec strtotime par exemple, je n'obtiens pas la meme chose.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager