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] Perdu avec strtotime et différence de temps


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Inscrit en
    Février 2006
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 174
    Points : 62
    Points
    62
    Par défaut [Dates] Perdu avec strtotime et différence de temps
    Bonjour,

    Je dois calculer le nombre d'heures ou jour écouler entre deux dates.

    Je suis passé par strtotime pour transformer ma date en date unix. J'ai procédé comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    function calcul_delais($heureDeb,$heureFin,$jourDeb,$jourFin)
     {
        $dif=strtotime($jourFin)-strtotime($jourDeb);
     
    	echo date('h:i:s',$dif);
     
     
     }
     
     echo calcul_delais('','','2008-09-01 08:00:00','2008-09-01 09:00:00');
    Je voudrais qu'il m'affiche 1h, mais il m'affiche 02:00:00. Si j'affiche la date, il se ramène au 1 janvier 1970

    Je ne sais donc pas comment faire pour effectuer une différence entre deux dates unix et les ramener en dates normales...
    Quelqu'un peut-il m'éclairer?

  2. #2
    Membre confirmé
    Homme Profil pro
    Technophile Web
    Inscrit en
    Mai 2007
    Messages
    930
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Technophile Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 930
    Points : 467
    Points
    467
    Par défaut
    tu peux comparer deux timestamp
    puis après le convertir en date (avec strtotime)

  3. #3
    Membre du Club
    Inscrit en
    Février 2006
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 174
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par sliderman Voir le message
    tu peux comparer deux timestamp
    puis après le convertir en date (avec strtotime)
    je dois mal me débrouiller, je trouve -1

  4. #4
    Membre du Club
    Inscrit en
    Février 2006
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 174
    Points : 62
    Points
    62
    Par défaut
    Il y a quelque chose que je ne comprends pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $heuredeb=explode(":",$heureDeb);
    $heurefin=explode(":",$heureFin);
     
     
     
     
     
    $heureDeb=mktime($heuredeb[0],$heuredeb[1],$heuredeb[2],01,01,2009);
    $heureFin=mktime($heurefin[0],$heurefin[1],$heurefin[2],01,01,2009);
     
    echo $heureDeb." ";
    echo $heureFin." ";
    echo Date("Y",($heureFin-$heureDeb));
    echo Date("H:i:s", $heureFin-$heureDeb);

    J'obtiens bien qu'il y a une différence d'une heure si heuredeb= 08:00:00 et heurefin=09:00:00.

    Au niveau des dates, quelque soit l'affichage, je tombe sur 1970....

  5. #5
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    C'est tout à fait logique, que tu retrouves 1970, puisque c'est l'année de départ des timestamps.
    tu fais (2008-09-07 09:00:00) - (2008-09-07 08:00:00) tu obtiens 01:00:00 le 31 décembre 1970 (c'est à dire date 0 en timestamp)

  6. #6
    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
    Citation Envoyé par Maljuna Kris Voir le message
    C'est tout à fait logique, que tu retrouves 1970, puisque c'est l'année de départ des timestamps.
    tu fais (2008-09-07 09:00:00) - (2008-09-07 08:00:00) tu obtiens 01:00:00 le 31 décembre 1970 (c'est à dire date 0 en timestamp)
    Rectification :
    Dans notre fuseau horaire (Europe/Paris), le timestamp 0 est le 1er janvier 1970 à 01:00:00.

  7. #7
    Membre du Club
    Inscrit en
    Février 2006
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 174
    Points : 62
    Points
    62
    Par défaut
    Ok,

    Mais comment faire pour convertir en secondes un temps (du genre 15h45) en secondes, sans prendre en compte la notion de dates?

    Mon programme va recevoir une heure, par exemple 10h45. Je veux calculer la durée entre 12h00 et 10h45.. dois-je implémenter moi même une fonction pour transformer 12h00 et 10h45 en secondes?

  8. #8
    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
    Ce n'est pas ce que tu as demandé dans ton premier message :
    Citation Envoyé par skystef Voir le message
    Je dois calculer le nombre d'heures ou jour écouler entre deux dates.
    Cela dit, tu peux essayer un truc comme ç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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    <?php
      function dateUTC($date)
      {
        $laDate = new DateTime($date);
        $offset = ($laDate -> getOffset()) * - 1;
        $modification = ($offset < 0) ? $offset . ' seconds' : '+' . $offset . ' seconds';
        $laDate -> modify($modification);
        return $laDate -> format('Y-m-d H:i:s');
      }
     
      function mefMsg($ecart)
      {
        $difference = explode(':', $ecart);
        if (array_sum($difference) > 0)
        {
          $periode = array(' heure(s) ', ' minute(s) ', ' seconde(s) ');
          $msg = 'Il y a ';
          foreach ($difference as $cle => $valeur)
          {
            if ($valeur > 0)
            {
              $msg .= ($valeur * 1) . $periode[$cle];
            }
          }
          $msg .= 'd\'écart.';
        }
        else 
        {
          $msg = 'Il n\'y a pas d\'écart.';
        }
     
        return $msg;
      }
    //------------------------------------------------------------------------  
    //------------------------------------------------------------------------
      $debut = '2008-10-08 23:00:00';
      $fin = '2008-10-09 01:15:30';
     
      $debut = dateUTC($debut);
      $fin = dateUTC($fin);
     
      date_default_timezone_set('UTC');
     
      $ecart = strtotime($fin) - strtotime($debut);
     
      $msg = mefMsg(date('G:i:s', $ecart));
      echo $msg . '<br>';
    ?>
    Ce code est exécuter en sensiblement 1 millième de seconde, et ne fonctionne pas au-delà d'un écart de 23 h 59 m 59 s. Pour aller au-delà, il faut calculer l'écart différemment.

  9. #9
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Citation Envoyé par jeca Voir le message
    Rectification :
    Dans notre fuseau horaire (Europe/Paris), le timestamp 0 est le 1er janvier 1970 à 01:00:00.
    Désolé, je ne vois pas le temps passé

  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
    Citation Envoyé par Maljuna Kris Voir le message
    Désolé, je ne vois pas le temps passé
    Que devrais-je dire ? J'en suis à 61,5.

  11. #11
    Membre du Club
    Inscrit en
    Février 2006
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 174
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par jeca Voir le message
    Ce n'est pas ce que tu as demandé dans ton premier message :

    Cela dit, tu peux essayer un truc comme ç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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    <?php
      function dateUTC($date)
      {
        $laDate = new DateTime($date);
        $offset = ($laDate -> getOffset()) * - 1;
        $modification = ($offset < 0) ? $offset . ' seconds' : '+' . $offset . ' seconds';
        $laDate -> modify($modification);
        return $laDate -> format('Y-m-d H:i:s');
      }
     
      function mefMsg($ecart)
      {
        $difference = explode(':', $ecart);
        if (array_sum($difference) > 0)
        {
          $periode = array(' heure(s) ', ' minute(s) ', ' seconde(s) ');
          $msg = 'Il y a ';
          foreach ($difference as $cle => $valeur)
          {
            if ($valeur > 0)
            {
              $msg .= ($valeur * 1) . $periode[$cle];
            }
          }
          $msg .= 'd\'écart.';
        }
        else 
        {
          $msg = 'Il n\'y a pas d\'écart.';
        }
     
        return $msg;
      }
    //------------------------------------------------------------------------  
    //------------------------------------------------------------------------
      $debut = '2008-10-08 23:00:00';
      $fin = '2008-10-09 01:15:30';
     
      $debut = dateUTC($debut);
      $fin = dateUTC($fin);
     
      date_default_timezone_set('UTC');
     
      $ecart = strtotime($fin) - strtotime($debut);
     
      $msg = mefMsg(date('G:i:s', $ecart));
      echo $msg . '<br>';
    ?>
    Ce code est exécuter en sensiblement 1 millième de seconde, et ne fonctionne pas au-delà d'un écart de 23 h 59 m 59 s. Pour aller au-delà, il faut calculer l'écart différemment.

    Merci pour l'aide

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 01/07/2015, 11h13
  2. Différence de temps (dates et heures)
    Par Taratis dans le forum Langage
    Réponses: 10
    Dernier message: 29/01/2012, 16h21
  3. [Dates] problème avec strtotime
    Par grinder59 dans le forum Langage
    Réponses: 5
    Dernier message: 24/08/2007, 16h40
  4. [Dates] Date avec strtotime('next ...')
    Par lusitano11 dans le forum Langage
    Réponses: 2
    Dernier message: 17/01/2006, 23h03

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