IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Calculer le nombre d'heures entre 2 dates


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 77
    Points : 44
    Points
    44
    Par défaut Calculer le nombre d'heures entre 2 dates
    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

  2. #2
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 838
    Points
    2 838
    Par défaut
    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";
    ?>

  3. #3
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    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';
     
    ?>

  4. #4
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 838
    Points
    2 838
    Par défaut
    Effectivement, j'y avais pas pensé ^^

    Ton bout de code est sympa et effectivement, fais comme ça tout est pris en compte

  5. #5
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    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.

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    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');
    }
    ?>
    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
    si quelqu'un veut reprendre la reflexion moi je suis en bouilli.

  7. #7
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 060
    Points : 1 357
    Points
    1 357
    Par défaut
    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 :
    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>';
    ?>
    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-10-02');
      $dateFin = date_create('2009-10-30');
     
      $debut = $dateDebut -> format('U');
      $fin = $dateFin -> format('U');
     
      $heure = ($fin - $debut) / 3600;
      echo $heure . ' heures<br>';
    ?>
    CQFD.

    Mais dans tous les cas, ce code est éminemment plus rapide qu'une boucle.

  8. #8
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    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.

  9. #9
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 060
    Points : 1 357
    Points
    1 357
    Par défaut
    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.

  10. #10
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    La réponse de php.net :
    Les modificateurs relatives (ie : +1 hour) correspondent a un deplacement sur un horloge et non pas a un deplacement dans le temps réel
    Pour moi ce comportement n'a aucun sens.

  11. #11
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 060
    Points : 1 357
    Points
    1 357
    Par défaut
    Et pourtant, ce code :
    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');
    ?>
    affiche :
    2009-03-29 03:00:00
    Ce qui me semble correct.

    PS - J'utilise Php 5.2.0

  12. #12
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    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.

  13. #13
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 060
    Points : 1 357
    Points
    1 357
    Par défaut
    Et celui-ci :
    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;
    ?>
    affiche :
    Ce qui me semble tout aussi correct, bien qu'il considère le changement d'heure déjà effectué.

  14. #14
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    oui mais la tu n'as pas fait +1hour

  15. #15
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 060
    Points : 1 357
    Points
    1 357
    Par défaut
    Désolé, j'avais mal compris ce message :
    Citation Envoyé par sabotage Voir le message
    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.

  16. #16
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    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.

Discussions similaires

  1. Réponses: 3
    Dernier message: 07/08/2013, 17h37
  2. Calculer le nombre d'heures entre 2 dates
    Par enacta dans le forum VB.NET
    Réponses: 3
    Dernier message: 15/01/2012, 11h32
  3. [SQL] calcul du nombre d'heure entre deux dates
    Par ahmedbj dans le forum Requêtes
    Réponses: 2
    Dernier message: 02/03/2009, 12h10
  4. Calcul du nombre de mois entre 2 dates
    Par Bes74 dans le forum Access
    Réponses: 1
    Dernier message: 22/08/2006, 22h15
  5. calcule du nombre de jours entre 2 dates
    Par nazimb dans le forum ASP
    Réponses: 4
    Dernier message: 28/09/2004, 15h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo