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 :

comment convertir des secondes en une durée de temps ?


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 18
    Points : 26
    Points
    26
    Par défaut comment convertir des secondes en une durée de temps ?
    Bonjour,
    Je voudrais convertir simplement des secondes en une durée lisible, j'ai pensé à utiliser date().
    Voici le bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <? php
    $tempo = 4567;  // 60 x 60 + 16 x 60 + 7 = 4567
    # pourquoi
    echo date('H:i:s', $tempo);
    # affiche  "2:16:07" au lieu de "1:16:07" ?
    ?>

  2. #2
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    La fonction date n'est à la base pas prévu pour ça, elle est censé prendre un timestamp en paramètre. Après ta fonction marche (presque) car un timestamp n'est rien d'autre qu'un nombre de seconde à partir du 1er janvier 1970.

    Le décalage d'heure n'est du qu'au fuseau horaire qui doit être défini sur celui de Paris et non sur celui de Greenwich (ce qui en effet rajoute une heure).

    Pour contrer cela il te suffit d'utiliser la fonction gmdate et non date, qui formate une date par rapport au méridien de Greenwich, sans décalage horaire.
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  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
    Comme son nom l'indique date() manipule des dates et pas des durées.

    Tu peux utiliser modulo :

    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
    <?php
     
    $inputSeconds = 4567;
     
    $secondsInAMinute = 60;
    $secondsInAnHour  = 60 * $secondsInAMinute;
    $secondsInADay    = 24 * $secondsInAnHour;
     
    $days = floor($inputSeconds / $secondsInADay);
     
    // extract hours
    $hourSeconds = $inputSeconds % $secondsInADay;
    $hours = floor($hourSeconds / $secondsInAnHour);
     
    // extract minutes
    $minuteSeconds = $hourSeconds % $secondsInAnHour;
    $minutes = floor($minuteSeconds / $secondsInAMinute);
     
    // extract the remaining seconds
    $remainingSeconds = $minuteSeconds % $secondsInAMinute;
    $seconds = ceil($remainingSeconds);
     
    echo $hours . 'h ' . $minutes . 'm ' . $seconds . 's';
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  4. #4
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    en plus court :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $base_60 = function($p) { return ($p >= 60) ? [$p % 60, floor($p / 60)] : [$p, 0]; };
    $sec     = $base_60(4567);
    $min     = $base_60($sec[1]);
    $hours   = $min[1];
    echo sprintf("%02d:%02d:%02d", $hours, $min[0], $sec[0]);

  5. #5
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Même si certes la fonction gmdate, tout comme date, est censée manipuler des dates et non des durées, elle me semble très bien convenir à son problème (qu'est ce qu'un timestamp sinon une durée depuis le 1er janvier 1970 ?). C'est une utilisation détournée certes, mais qui n'en fausse pas pour autant le résultat.
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 18
    Points : 26
    Points
    26
    Par défaut
    Merci pour vos réponses aussi rapides et complètes.

    @ rawsrc : jolie formule à laquelle je n'aurai jamais pensée, merci beaucoup.
    @ sabotage : merci pour ce code si détaillé
    @ Spartacusply : gmdate() me renvoie la bonne heure mais ajoute un jour (et c'est bien normal ), même en définissant : date_default_timezone_set('Europe/Paris');

    Comme c'était un exemple et que j'avais éventuellement des jours dans le résultat, la fonction date() renvoyant 1j 1h de trop, j'ai écrit ceci :

    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
    function secondenduree($se){
    	$mi = floor($se/60);
    	$rs = $se%60;
    	$rs = $rs > 9 ? $rs : '0'.$rs;
    	$he = floor($mi/60);
    	$rm = $mi%60;
    	$rm = $rm > 9 ? $rm : '0'.$rm;
    	$jo = floor($he/24);
    	$rh = $he%24;
    	$rh = $rh > 9 ? $rh : '0'.$rh;
    	return $jo.'j '.$rh.':'.$rm.':'.$rs;
    }
    function secondentexte($se){
    	$mi = floor($se/60);
    	$rs = $se%60;
    	$rs = $rs > 9 ? $rs : '0'.$rs;
    	$ts = $rs > 1 ? ' secondes ' : ' seconde ';
    	$he = floor($mi/60);
    	$rm = $mi%60;
    	$rm = $rm > 9 ? $rm : '0'.$rm;
    	$tm = $rm > 1 ? ' minutes ' : ' minute ';
    	$jo = floor($he/24);
    	$rh = $he%24;
    	$rh = $rh > 9 ? $rh : '0'.$rh;
    	$th = $rh > 1 ? ' heures ' : ' heure ';
    	$tj = $jo > 1 ? ' jours ' : ' jour ';
    	return $jo.$tj.$rh.$th.$rm.$tm.$rs.$ts;
    }

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 18
    Points : 26
    Points
    26
    Par défaut
    Pour finir, voici ce que j'utilise, merci à rawsrc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    function rawsrc($argu)
    {
    	$base = function($ba,$se) { return ($ba >= $se) ? array($ba % $se, floor($ba / $se)) : array($ba, 0); };
    	$seco = $base($argu,60);
    	$minu = $base($seco[1],60);
    	$heur = $base($minu[1],24);
    	return sprintf("%01dj %02d:%02d:%02d", $heur[1], $heur[0], $minu[0], $seco[0]);
    }
    J'ai remplacé les crochets [ ] du return par array() car j'avais une erreur.

  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
    C'est une utilisation détournée certes, mais qui n'en fausse pas pour autant le résultat.
    si le temps dépasse un jour, ça ne marchera plus.

    en plus court
    Je te deteste
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 18
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par sabotage Voir le message

    Je te deteste
    LOL

    Pendant que j'y pense, j'ai du code javascript qu'il doit-être possible d'optimiser, je vais aller faire un tour par là bas ...

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

Discussions similaires

  1. Comment faire des etats pour une application web ?
    Par ovh dans le forum Autres outils décisionnels
    Réponses: 6
    Dernier message: 06/07/2021, 03h25
  2. comment convertir des secondes en hh:mm:ss en xsl
    Par Jayceblaster dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 22/07/2005, 10h24
  3. [Fonction SQL Serveur] convertir des secondes en heure
    Par falcon dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 17/11/2004, 17h22
  4. Réponses: 14
    Dernier message: 15/01/2004, 01h15
  5. [langage] Comment rajouter des champs dans une liste
    Par toto_titi dans le forum Langage
    Réponses: 4
    Dernier message: 28/08/2003, 14h09

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