web-dev-qa-db-fra.com

Comment convertir les secondes en format d'heure?

Pour une raison quelconque, je convertis un format d'heure tel que: 03:30 to seconds 3*3600 + 30*60, now. Je veux le reconvertir dans son premier (même) format. Comment cela pourrait-il être?

Ma tentative:

3*3600 + 30*60 = 12600 

12600 / 60 = 210 / 60 = 3.5, floor(3.5) = 3 = hour

Maintenant, qu'en est-il des minutes?

Considérant que la valeur peut être comme 19:00 or 02:51. Je pense que vous avez la photo.

Et au fait, comment convertir 2:0 for example to 02:00 using RegEx?

54
Dewan159
$hours = floor($seconds / 3600);
$mins = floor($seconds / 60 % 60);
$secs = floor($seconds % 60);

Si vous voulez obtenir le format de l'heure:

$timeFormat = sprintf('%02d:%02d:%02d', $hours, $mins, $secs);
118
ITroubs

Cela pourrait être plus simple

gmdate("H:i:s", $seconds)

PHP gmdate

162
CyberJunkie

Si vous savez que les heures seront inférieures à une heure, vous pouvez simplement utiliser les fonctions date() ou $date->format().

$minsandsecs = date('i:s',$numberofsecs);

Cela fonctionne parce que l'époque système commence à minuit (le 1er janvier 1970, mais ce n'est pas important pour vous).

Si c'est une heure ou plus mais moins d'un jour, vous pouvez le sortir en format heure: minutes: secondes avec `

$hoursminsandsecs = date('H:i:s',$numberofsecs);

Pendant plus d'une journée, vous devrez utiliser le module pour calculer le nombre de jours, car c'est ici que la date de début de l'époque deviendrait pertinente.

J'espère que ça t'as aidé.

15
Spudley

Peut-être que le moyen le plus simple est:

gmdate('H:i:s', $your_time_in_seconds);
11
marco_manti

Laisser $time soit le temps en nombre de secondes.

$seconds = $time % 60;
$time = ($time - $seconds) / 60;
$minutes = $time % 60;
$hours = ($time - $minutes) / 60;

Maintenant, les heures, minutes et secondes sont dans $hours, $minutes et $seconds respectivement.

10
Hammerite

Une autre solution qui vous donnera les jours, les heures, les minutes et les secondes pour une valeur de secondes écoulée:

function seconds_to_time($secs)
{
    $dt = new DateTime('@' . $secs, new DateTimeZone('UTC'));
    return array('days'    => $dt->format('z'),
                 'hours'   => $dt->format('G'),
                 'minutes' => $dt->format('i'),
                 'seconds' => $dt->format('s'));
}

print_r(seconds_to_time($seconds_value);

Une logique supplémentaire sera nécessaire pour les "jours" si le temps prévu est supérieur à un an. Utilisez str_pad () ou ltrim () pour ajouter/supprimer les zéros de gauche.

8
GZipp

Si vous deviez le coder en dur, vous utiliseriez le module pour extraire l'heure comme d'autres l'ont suggéré.

Si vous renvoyez les secondes de la base de données MySQL, en supposant que vous n’avez pas besoin du format de données en secondes dans votre application, il existe un moyen beaucoup plus simple de le faire. Vous pouvez utiliser le fichier SEC_TO_TIME de MySQL. heure de retour au format hh: mm: ss.

Par exemple.

SELECT SEC_TO_TIME(my_seconds_field) AS my_timestring;
7

ITroubs answer ne traite pas les secondes restantes lorsque vous souhaitez utiliser ce code pour convertir un nombre de secondes au format d'heure tel que heures: minutes: secondes

Voici ce que j'ai fait pour régler ce problème: (Cela ajoute également un zéro non significatif à des minutes et des secondes à un chiffre)

$seconds = 3921; //example

$hours = floor($seconds / 3600);
$mins = floor(($seconds - $hours*3600) / 60);
$s = $seconds - ($hours*3600 + $mins*60);

$mins = ($mins<10?"0".$mins:"".$mins);
$s = ($s<10?"0".$s:"".$s); 

$time = ($hours>0?$hours.":":"").$mins.":".$s;

$ time contiendra "1:05:21" dans cet exemple.

7
Flaxious

Désolé c'est trop tard mais peut-être utile

function mediaTimeDeFormater($seconds)
{
    if (!is_numeric($seconds))
        throw new Exception("Invalid Parameter Type!");


    $ret = "";

    $hours = (string )floor($seconds / 3600);
    $secs = (string )$seconds % 60;
    $mins = (string )floor(($seconds - ($hours * 3600)) / 60);

    if (strlen($hours) == 1)
        $hours = "0" . $hours;
    if (strlen($secs) == 1)
        $secs = "0" . $secs;
    if (strlen($mins) == 1)
        $mins = "0" . $mins;

    if ($hours == 0)
        $ret = "$mins:$secs";
    else
        $ret = "$hours:$mins:$secs";

    return $ret;
}

echo mediaTimeDeFormater(216.064000);//3:36
3
Soroush Khosravi

quelque chose comme ça?

 if(is_numeric($time)){
$value = array(
  "years" => 0, "days" => 0, "hours" => 0,
  "minutes" => 0, "seconds" => 0,
);
if($time >= 31556926){
  $value["years"] = floor($time/31556926);
  $time = ($time%31556926);
}
if($time >= 86400){
  $value["days"] = floor($time/86400);
  $time = ($time%86400);
}
if($time >= 3600){
  $value["hours"] = floor($time/3600);
  $time = ($time%3600);
}
if($time >= 60){
  $value["minutes"] = floor($time/60);
  $time = ($time%60);
}
$value["seconds"] = floor($time);
return (array) $value;

} else {return (bool) FALSE; }

récupéré à partir de: http://www.ckorp.net/sec2time.php

3
FatherStorm

Utilisez modulo:

$hours = $time_in_seconds / 3600;
$minutes = ($time_in_seconds / 60) % 60;
2
bitmask

juste un petit exemple supplémentaire

temps demandé en millisecondes

    // ms2time( (microtime(true) - ( time() - Rand(0,1000000) ) ) );
    // return array
    function ms2time($ms){
        $return = array();
        // ms
        $return['ms'] = (int) number_format( ($ms - (int) $ms), 2, '', '');
        $seconds = (int) $ms;
        unset($ms);

        if ($seconds%60 > 0){
            $return['s'] = $seconds%60;
        } else {
            $return['s'] = 0;
        }

        if ( ($minutes = intval($seconds/60))){
            $return['m'] = $minutes;
        }

        if (isset($return['m'])){
            $return['h'] = intval($return['m'] / 60);
            $return['m']  = $return['m'] % 60; 
        }


        if (isset($return['h'])){
            $return['d'] = intval($return['h'] / 24);
            $return['h']  = $return['h'] % 24; 
        }

        if (isset($return['d']))
            $return['mo'] = intval($return['d'] / 30);

        foreach($return as $k=>$v){
            if ($v == 0)
                unset($return[$k]);
        }

        return $return;
    }

    // ms2time2string( (microtime(true) - ( time() - Rand(0,1000000) ) ) );
    // return array     
    function ms2time2string($ms){
        $array = array(
            'ms' => 'ms',
            's'  => 'seconds',
            'm'  => 'minutes',
            'h'  => 'hours',
            'd'  => 'days',
            'mo' => 'month',
        );


        if ( ( $return = ms2time($ms) )  && count($ms) > 0){

            foreach($return as $key=>$data){
                $return[$key] = $data .' '.$array[$key];
            }

        }
        return implode(" ", array_reverse($return));
    }
2
Butuzov

Voici une autre façon avec "0" en tête pour tous.

$secCount = 10000;
$hours = str_pad(floor($secCount / (60*60)), 2, '0', STR_PAD_LEFT);
$minutes = str_pad(floor(($secCount - $hours*60*60)/60), 2, '0', STR_PAD_LEFT);
$seconds = str_pad(floor($secCount - ($hours*60*60 + $minutes*60)), 2, '0', STR_PAD_LEFT);

C'est une adaptation de la réponse de Flaxious.

2
Gardner