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 :

[Dates] Problème de différence d'heure ( manipulation de timestamp)


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    96
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 96
    Points : 63
    Points
    63
    Par défaut [Dates] Problème de différence d'heure ( manipulation de timestamp)
    Je veux créer une fonction qui fait la différence entre 2 heures au format
    hh.mm

    J'ai donc écris les fonctions suivantes :

    Code : 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
    17
    18
    19
    20
    21
    22
    23
     
    // Heure sous la forme hh.mm
    function HeureToTimeStamp($heure)
    {
    list($hour,$minute) = explode('.', $heure);
    $timestamp = mktime($hour,$minute);
    return $timestamp;
    }
     
     
    function TimeStampToHeure($timestamp)
    {
    return date('H.i',$timestamp);
    }
     
     
    function DiffHeure($HeureDebut, $HeureFin)
    {	
    	$HDTimeStamp = HeureToTimeStamp($HeureDebut);
    	$HFTimeStamp = HeureToTimeStamp($HeureFin);
    	$HeureFinaleTimeStamp = $HFTimeStamp - $HDTimeStamp;
    	return TimeStampToHeure($HeureFinaleTimeStamp);
    }
    Malheureusement j'obtiens des résultats hasardeux du style
    DiffHeure(23.5,5)
    Retourne 06.55

    Une idée ?

  2. #2
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Points : 624
    Points
    624
    Par défaut
    Heuuu tu veux une fonction qui donne le temps écoulé entre 2 dates (heures ?)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function Dif($date1, $date2)
    {
        $dif_en_sec = $date2 - $date1
        return floor($dif_en_sec / 3600).'H'.floor(($dif_en_sec % 3600) / 60).'Min'.floor(($dif_en_sec % 60)).'sec';
    }
    (fonction écrite vite fait a la volée, a tester donc)
    Si vous avez un message d'erreur, n'oubliez pas de le lire, la réponse à votre problème est surement dedans !

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    96
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 96
    Points : 63
    Points
    63
    Par défaut
    Merci de ta réponse mais ça ne corrige pas mon problème de code.

    Quant à ta fonction elle ne renvoit pas le bon résultat :
    Dif(13,22.5);
    retourne 0H0Min9sec
    et non 9.5 .

  4. #4
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Points : 624
    Points
    624
    Par défaut
    ah ok ! tu veux gérer ça comme ça... Ajoute au debut de la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $date1 = substr($date1, 0, strpos($date1, '.'))*3600 +  substr($date1, strpos($date1, '.'))*60;
    $date2 = substr($date2, 0, strpos($date1, '.'))*3600 +  substr($date2, strpos($date2, '.'))*60;
    Ca sous entend que 10.5 corresponde a 10h50 (et non 10h30) !
    Si vous avez un message d'erreur, n'oubliez pas de le lire, la réponse à votre problème est surement dedans !

  5. #5
    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
    Bonjour,

    Essaie avec ça :
    Code : 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    <?php
      function diffHeure($tempsDeb, $tempsFin)
      {
        //-- calcul en heures et minutes -----------
        list($hDeb, $mDeb) = explode('.', $tempsDeb);
        list($hFin, $mFin) = explode('.', $tempsFin);
     
        $TStempsDeb = ($hDeb * 60) + $mDeb;
        $TStempsFin = ($hFin * 60) + $mFin;
     
        $TSecart = 0;
        if($TStempsDeb > $TStempsFin)
        {
          //-- calcul écart entre début et minuit ----------
          $TSecart += (24 * 60) - $TStempsDeb;
          //-- ajoute le temps après minuit ---------
          $TSecart += $TStempsFin;
        }
        else if($TStempsDeb < $TStempsFin)
        {
          $TSecart += $TStempsFin - $TStempsDeb;
        }
     
        $ecart = floor($TSecart / 60) . '.' . ($TSecart % 60);
        return $ecart;
      }
    //----------------------------------------  
    //----------------------------------------  
      $tempsDeb = '23.50';
      $tempsFin = '5.00';
     
      echo diffHeure($tempsDeb, $tempsFin);
    ?>

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    96
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 96
    Points : 63
    Points
    63
    Par défaut
    Citation Envoyé par gloubi Voir le message
    ah ok ! tu veux gérer ça comme ça... Ajoute au debut de la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $date1 = substr($date1, 0, strpos($date1, '.'))*3600 +  substr($date1, strpos($date1, '.'))*60;
    $date2 = substr($date2, 0, strpos($date1, '.'))*3600 +  substr($date2, strpos($date2, '.'))*60;
    @gloubi :Ca sous entend que 10.5 corresponde a 10h50 (et non 10h30) !
    Non ça ne sous entend pas ça :
    Ecart entre 22.5 et 13 = 9.5 signifie qu'on prend 22.5 comme 22h30 !
    Merci quand même pour ta réponse.

    @jeca : Ca ressemble un peu plus à ce que je veux, mais je trouve le même style de résultats qu'avec ma fonction c'est à dire des O.55 au lieu de O.5 par exemple :
    diffHeure(23.5,5) retourne 5.55 et non 5.5.

    Je dois avoir loupé une subtilité quelque part.

  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
    Pour les valeurs que tu donnes (23.5 et 5), ma fonction retourne un message d'erreur, ce qui est normal : en effet, tu as précisé dans ton 1er message que les heures sont en heures et minutes. Or le format des valeurs que tu donnes est incorrect dans ce cas ; ce devrait être 23.50 et 5.00, ce qui retourne 5.10, c'est-à-dire 5 heures et 10 minutes, résultat correct.

    Or, il s'avère qu'elles sont en heures et centièmes d'heure ; ce qui n'est pas du tout la même chose.

    Et dans ce cas :
    Code : 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    <?php
      function diffHeure($tempsDeb, $tempsFin)
      {
        //-- calcul en heures et centièmes -----------
        $ecart = 0;
        if($tempsDeb > $tempsFin)
        {
          //-- calcul écart entre début et minuit ----------
          $ecart += 24 - $tempsDeb;
          //-- ajoute le temps après minuit ---------
          $ecart += $tempsFin;
        }
        else if($tempsDeb < $tempsFin)
        {
          $ecart += $tempsFin - $tempsDeb;
        }
     
        return $ecart;
      }
    //----------------------------------------  
    //----------------------------------------  
      $tempsDeb = '23.5';
      $tempsFin = '5';
     
      echo diffHeure($tempsDeb, $tempsFin);
    ?>
    retourne bien 5.5

    Il est entendu aussi que l'écart maximum ne peut être que de 24 heures, car il n'y a pas de notion de date.

  8. #8
    Membre régulier Avatar de bartrik
    Inscrit en
    Novembre 2003
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 104
    Points : 122
    Points
    122
    Par défaut
    si tu fait DiffHeure(23.5,5), ta fonction list($hour,$minute) donne $hour=23 (ça c'est ok) et $minute=5 et pas 50
    Par contre si tu fait DiffHeure("23.50","5"), ça fonctionne

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    96
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 96
    Points : 63
    Points
    63
    Par défaut
    Je crois que vos 2 réponses finissent de résoudre à mon problème.

    C'est vrai que pour moi le 0.5, correspond à une demi heure et pas 50 minutes et comme tu le dis bartrik quand je fais list($hour,$minute) de 23.5 ( enfin 23.50 pour que ça marche alors ) je prenais donc 50 au lieu de 30 minutes.

    Et le code de jeca marche en conséquence parfaitement dans mon cas.

    Résolu merci les devs de chocs !

  10. #10
    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
    Tu n'as toujours pas dit si tu est en heures, minutes ou bien en heures, centièmes.
    Dans le 1er cas, tu dois fournir un format correct, soit 23.50 et 5.00 ou 5.0, car 23.5 vaut 23 heures et 5 minutes, et 5 fait planter 'list()' car il attend un élément de tableau qui n'existe pas ; dans le 2è, 23.5 et 5 sont suffisants.
    Utilise l'une ou l'autre des fonctions en rapport avec ton cas.

    Tu peux aussi ajouter ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        $tempsDeb = number_format($tempsDeb, 2, '.', '');
        $tempsFin = number_format($tempsFin, 2, '.', '');
    en tête de la 1ère fonction afin d'envoyer les valeurs 23.5 et 5 sans plantage, mais elle te retournera toujours 5 heures et 10 minutes. Le tout étant de savoir ce que tu cherches à faire, ce que personne ne sait jusqu'à présent.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    96
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 96
    Points : 63
    Points
    63
    Par défaut
    Bon je pensais pourtant me faire comprendre .

    Donc je développe une application qui permet de saisir un planning, on stocke alors $HeureDebut $HeureFin et $NombreHeure dans la BDD en heure.centième d'heure.

    Je suis ainsi dans ton second cas, et la fonction que tu proposes à l'air de convenir à mon affaire.

    Je viens d'ailleurs de modifier ma fonction de calcul de l'heure de fin en m'inspirant de DiffDate() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    function CalcHeureFin($HeureDebut, $NombreHeure)
      {
    	$Ecart = $HeureDebut + $NombreHeure;
    	$HeureFin = 0;
        if($Ecart>24)
        {
          $HeureFin = ($HeureDebut + $NombreHeure) - 24 ;
        }
        else
        {
    	$HeureFin = $HeureDebut + $NombreHeure;
        }
        return $HeureFin ;
      }
    A partir de ce planning je dois calculer un certain nombre de valeurs dont le nombre d'heures de nuits effectuées par exemple, d'où ma fonction DiffDate avec dans mon cas des heures de nuits qui vont de 22h à 5h.

    En espérant t'avoir un peu éclairé.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [DATE] Différence en heure par rapport à un intervalle d'heure
    Par Katachana dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 04/06/2007, 16h08
  2. [Dates] Problème avec heure d'été
    Par crashou13 dans le forum Langage
    Réponses: 2
    Dernier message: 02/03/2007, 15h41
  3. [Dates] Problème avec date (heure qui varie)
    Par Death83 dans le forum Langage
    Réponses: 10
    Dernier message: 05/08/2006, 02h19
  4. [Dates] Problème avec des dates et Heures
    Par snakejl dans le forum Langage
    Réponses: 9
    Dernier message: 16/05/2006, 18h04
  5. Différence date .. problème #Erreur
    Par priest69 dans le forum Access
    Réponses: 1
    Dernier message: 06/10/2005, 15h04

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