Konvertieren Sie Sekunden in Stunde: Minute: Sekunde


330

Ich muss Sekunden in "Stunde: Minute: Sekunde" umrechnen.

Zum Beispiel: "685" konvertiert in "00:11:25"

Wie kann ich das erreichen?


4
Die Frage ist nicht eindeutig: Sie möchten Ihre secondsin eine date/timeoder in eine Anzahl von Stunden umwandeln : Minute: Sekunden?
WonderLand

Antworten:


741

Sie können die gmdate()Funktion verwenden:

echo gmdate("H:i:s", 685);

166
Stellen Sie jedoch sicher, dass die Anzahl der Sekunden unter 86.400 liegt.
salathe

12
H steht für die Anzahl der Stunden an einem einzelnen Tag. Wenn Sie also 90000 Sekunden Zeit haben und H verwenden, ist das Ergebnis 01 (erste Stunde eines nächsten Tages). NICHT 25 - ein Tag hat nur 24 Stunden.
MarcinWolny

7
Ich bin mir nicht sicher, ob dies die richtige Antwort ist. Dies führt zu einem datetime... Wenn wir also ein Ergebnis> 24 Stunden erwarten, wird es nicht funktionieren. Auch wenn wir ein negatives Ergebnis benötigen (zum Beispiel mit Offset arbeiten), funktioniert es nicht. -1für die Lerche der Details
WonderLand

54
Dies sollte aufgrund des offensichtlichen Fehlers für Zeiten von mehr als 24 Stunden nicht die akzeptierte Antwort sein.
Scott Flack

10
Für die Verwendung mit Tagen, an denen die Zahlen möglicherweise größer als 85399 sind, können Sie verwenden. echo gmdate("z H:i:s", 685);Z ist die Anzahl der Tage im Jahr, die mit 0 beginnen. Sie können natürlich das PHP- Datumshandbuch lesen , um Ihren spezifischen Anforderungen gerecht zu werden.
Nightwolf

177

Eine Stunde ist 3600 Sekunden, eine Minute ist 60 Sekunden. Warum also nicht:

<?php

$init = 685;
$hours = floor($init / 3600);
$minutes = floor(($init / 60) % 60);
$seconds = $init % 60;

echo "$hours:$minutes:$seconds";

?>

welches produziert:

$ php file.php
0:11:25

(Ich habe nicht so viel getestet, daher kann es zu Fehlern mit dem Boden oder so kommen.)


Aber er will zwei Nullen ... "00:11:25" nicht "0:11:25"
animuson

52
printf("%02d:%02d:%02d", $hours, $minutes, $seconds);
Amber

5
Gute Antwort, aber stellen Sie sicher, dass Sie zwischen den einzelnen Vorgängen $ Stunden * 3600 und $ Minuten * 60 von $ init abziehen, da Sie sonst Minuten und Sekunden doppelt zählen.
Mike Stowe

5
Verwenden Sie sprintfzum Hinzufügen zu @ Bernsteins Kommentar, um den Wert zurückzugeben, anstatt ihn zu drucken.
Allen Butler

77

Bitte schön

function format_time($t,$f=':') // t = seconds, f = separator 
{
  return sprintf("%02d%s%02d%s%02d", floor($t/3600), $f, ($t/60)%60, $f, $t%60);
}

echo format_time(685); // 00:11:25

1
Funktioniert nicht für negative Werte. Wenn Sie ein negatives Sekundenintervall haben, verwenden Sie dieses:return ($t< 0 ? '-' : '') . sprintf("%02d%s%02d%s%02d", floor(abs($t)/3600), $f, (abs($t)/60)%60, $f, abs($t)%60); }
Ajax

66

Verwenden Sie die Funktion gmdate() nur, wenn die Sekunden kleiner als 86400(1 Tag) sind :

$seconds = 8525;
echo gmdate('H:i:s', $seconds);
# 02:22:05

Siehe: gmdate ()

Führen Sie die Demo aus


Konvertieren Sie Sekunden in ein Format mit 'Fuß' ohne Limit * :

$seconds = 8525;
$H = floor($seconds / 3600);
$i = ($seconds / 60) % 60;
$s = $seconds % 60;
echo sprintf("%02d:%02d:%02d", $H, $i, $s);
# 02:22:05

Siehe: floor () , sprintf () , arithmetische Operatoren

Führen Sie die Demo aus


Beispiel für die Verwendung der DateTimeErweiterung:

$seconds = 8525;
$zero    = new DateTime("@0");
$offset  = new DateTime("@$seconds");
$diff    = $zero->diff($offset);
echo sprintf("%02d:%02d:%02d", $diff->days * 24 + $diff->h, $diff->i, $diff->s);
# 02:22:05

Siehe: DateTime :: __ construct () , DateTime :: modify () , clone , sprintf ()

Führen Sie die Demo aus


Der MySQL-Beispielbereich des Ergebnisses ist auf den Datentyp TIME beschränkt, der von -838:59:59bis reicht838:59:59 :

SELECT SEC_TO_TIME(8525);
# 02:22:05

Siehe: SEC_TO_TIME

Führen Sie die Demo aus


PostgreSQL-Beispiel:

SELECT TO_CHAR('8525 second'::interval, 'HH24:MI:SS');
# 02:22:05

Führen Sie die Demo aus


30

Andere Lösungen verwenden gmdate, scheitern jedoch in Randfällen, in denen Sie mehr als 86400 Sekunden haben. Um dies zu umgehen, können wir einfach die Anzahl der Stunden selbst gmdateberechnen und dann die verbleibenden Sekunden in Minuten / Sekunden berechnen lassen .

echo floor($seconds / 3600) . gmdate(":i:s", $seconds % 3600);

Eingabe: 6030 Ausgabe:1:40:30

Eingabe: 2000006030 Ausgabe:555557:13:50


16
// TEST
// 1 Day 6 Hours 50 Minutes 31 Seconds ~ 111031 seconds

$time = 111031; // time duration in seconds

$days = floor($time / (60 * 60 * 24));
$time -= $days * (60 * 60 * 24);

$hours = floor($time / (60 * 60));
$time -= $hours * (60 * 60);

$minutes = floor($time / 60);
$time -= $minutes * 60;

$seconds = floor($time);
$time -= $seconds;

echo "{$days}d {$hours}h {$minutes}m {$seconds}s"; // 1d 6h 50m 31s

$ hms = gmdate ("H: i: s", 12720); Es reicht nicht aus, Tag-Stunde-Min-Sek.
Mogul

7
gmdate("H:i:s", no_of_seconds);

Gibt keine Zeit im H:i:sFormat an, wenn sie no_of_secondsgrößer als 1 Tag ist (Sekunden pro Tag).
Es wird den Tageswert vernachlässigen und nur gebenHour:Min:Seconds

Zum Beispiel:

gmdate("H:i:s", 89922); // returns 0:58:42 not (1 Day 0:58:42) or 24:58:42

6

Hier ist ein Einzeiler, der negative Sekunden und Sekunden im Wert von mehr als einem Tag verarbeitet.

sprintf("%s:%'02s:%'02s\n", intval($seconds/60/60), abs(intval(($seconds%3600) / 60)), abs($seconds%60));

Zum Beispiel:

$seconds= -24*60*60 - 2*60*60 - 3*60 - 4; // minus 1 day 2 hours 3 minutes 4 seconds
echo sprintf("%s:%'02s:%'02s\n", intval($seconds/60/60), abs(intval(($seconds%3600) / 60)), abs($seconds%60));

Ausgänge: -26: 03: 04


funktioniert nicht, wenn negativ und weniger als 1 Stunde: -3000 = 0:50:00 sollte -0: 50: 00 sein
Tony Brix

5

Schreibfunktion wie diese, um ein Array zurückzugeben

function secondsToTime($seconds) {

  // extract hours
  $hours = floor($seconds / (60 * 60));

  // extract minutes
  $divisor_for_minutes = $seconds % (60 * 60);
  $minutes = floor($divisor_for_minutes / 60);

  // extract the remaining seconds
  $divisor_for_seconds = $divisor_for_minutes % 60;
  $seconds = ceil($divisor_for_seconds);

  // return the final array
  $obj = array(
      "h" => (int) $hours,
      "m" => (int) $minutes,
      "s" => (int) $seconds,
   );

  return $obj;
}

Rufen Sie dann einfach die Funktion folgendermaßen auf:

secondsToTime(100);

Ausgabe ist

Array ( [h] => 0 [m] => 1 [s] => 40 )

5

Wenn Sie akzeptierte oder beliebte Antworten nicht mögen, probieren Sie diese aus

function secondsToTime($seconds_time)
{
    if ($seconds_time < 24 * 60 * 60) {
        return gmdate('H:i:s', $seconds_time);
    } else {
        $hours = floor($seconds_time / 3600);
        $minutes = floor(($seconds_time - $hours * 3600) / 60);
        $seconds = floor($seconds_time - ($hours * 3600) - ($minutes * 60));
        return "$hours:$minutes:$seconds";
    }
}

secondsToTime(108620); // 30:10:20

4

Sehen:

    /** 
     * Convert number of seconds into hours, minutes and seconds 
     * and return an array containing those values 
     * 
     * @param integer $inputSeconds Number of seconds to parse 
     * @return array 
     */ 

    function secondsToTime($inputSeconds) {

        $secondsInAMinute = 60;
        $secondsInAnHour  = 60 * $secondsInAMinute;
        $secondsInADay    = 24 * $secondsInAnHour;

        // extract days
        $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);

        // return the final array
        $obj = array(
            'd' => (int) $days,
            'h' => (int) $hours,
            'm' => (int) $minutes,
            's' => (int) $seconds,
        );
        return $obj;
    }

Von: Konvertieren Sie Sekunden in Tage, Stunden, Minuten und Sekunden


3

Versuche dies:

date("H:i:s",-57600 + 685);

Entnommen aus
http://bytes.com/topic/php/answers/3917-seconds-converted-hh-mm-ss


Nicht ganz sicher, aber ich bin mir ziemlich sicher, dass es die Zeit auf 0 setzt und alles darüber hinaus einfach die richtige Antwort wäre
Kerry Jones

Dies stellt führende Nullen
barfoon

@barfoon - stimmt, aber ich glaube, das ist es, wonach M.Ezz gefragt hat, und es ist ein Standard, der in der Zeit verwendet wird. Das sieht aus meiner Erfahrung seltsam aus. "3: 7: 5" statt "03:07:05" oder sogar "3: 7" sieht für mich eher nach einem Verhältnis aus.
Kerry Jones

3

Die Funktion gmtdate () hat bei mir nicht funktioniert, da ich die an einem Projekt geleisteten Arbeitsstunden nachverfolgt habe. Wenn es mehr als 24 Stunden sind, wird der nach 24 Stunden verbleibende Betrag abgezogen. Mit anderen Worten, 37 Stunden werden 13 Stunden. (alles wie oben von Glavic angegeben - danke für Ihre Beispiele!) Dieser hat gut funktioniert:

Convert seconds to format by 'foot' no limit :
$seconds = 8525;
$H = floor($seconds / 3600);
$i = ($seconds / 60) % 60;
$s = $seconds % 60;
echo sprintf("%02d:%02d:%02d", $H, $i, $s);
# 02:22:05

3

Diese Funktion kann nützlich sein, Sie können sie erweitern:

function formatSeconds($seconds) {

if(!is_integer($seconds)) {
    return FALSE;
}

$fmt = "";

$days = floor($seconds / 86400);
if($days) {
    $fmt .= $days."D ";
    $seconds %= 86400;
}

$hours = floor($seconds / 3600);
if($hours) {
    $fmt .= str_pad($hours, 2, '0', STR_PAD_LEFT).":";
    $seconds %= 3600;
}

$mins = floor($seconds / 60 );
if($mins) {
    $fmt .= str_pad($mins, 2, '0', STR_PAD_LEFT).":";
    $seconds %= 60;
}

$fmt .= str_pad($seconds, 2, '0', STR_PAD_LEFT);

return $fmt;}

2

Lösung von: https://gist.github.com/SteveJobzniak/c91a8e2426bac5cb9b0cbc1bdbc45e4b

Hier ist eine sehr saubere und kurze Methode!

Dieser Code vermeidet so weit wie möglich die mühsamen Funktionsaufrufe und das stückweise Erstellen von Zeichenfolgen sowie die großen und umfangreichen Funktionen, die die Leute dafür ausführen.

Es erzeugt das Format "1h05m00s" und verwendet führende Nullen für Minuten und Sekunden, solange eine andere Zeitkomponente ungleich Null vor ihnen steht.

Außerdem werden alle leeren führenden Komponenten übersprungen, um zu vermeiden, dass Sie nutzlose Informationen wie "0h00m01s" erhalten (stattdessen wird dies als "1s" angezeigt).

Beispielergebnisse: "1s", "1m00s", "19m08s", "1h00m00s", "4h08m39s".

$duration = 1; // values 0 and higher are supported!
$converted = [
    'hours' => floor( $duration / 3600 ),
    'minutes' => floor( ( $duration / 60 ) % 60 ),
    'seconds' => ( $duration % 60 )
];
$result = ltrim( sprintf( '%02dh%02dm%02ds', $converted['hours'], $converted['minutes'], $converted['seconds'] ), '0hm' );
if( $result == 's' ) { $result = '0s'; }

Wenn Sie den Code noch kürzer (aber weniger lesbar) machen möchten, können Sie das $convertedArray vermeiden und stattdessen die Werte wie folgt direkt in den Aufruf von sprintf () einfügen:

$duration = 1; // values 0 and higher are supported!
$result = ltrim( sprintf( '%02dh%02dm%02ds', floor( $duration / 3600 ), floor( ( $duration / 60 ) % 60 ), ( $duration % 60 ) ), '0hm' );
if( $result == 's' ) { $result = '0s'; }

Die Dauer muss in beiden obigen Codeteilen 0 oder höher sein . Negative Dauern werden nicht unterstützt. Sie können jedoch mit negativen Dauern umgehen, indem Sie stattdessen den folgenden alternativen Code verwenden:

$duration = -493; // negative values are supported!
$wasNegative = FALSE;
if( $duration < 0 ) { $wasNegative = TRUE; $duration = abs( $duration ); }
$converted = [
    'hours' => floor( $duration / 3600 ),
    'minutes' => floor( ( $duration / 60 ) % 60 ),
    'seconds' => ( $duration % 60 )
];
$result = ltrim( sprintf( '%02dh%02dm%02ds', $converted['hours'], $converted['minutes'], $converted['seconds'] ), '0hm' );
if( $result == 's' ) { $result = '0s'; }
if( $wasNegative ) { $result = "-{$result}"; }
// $result is now "-8m13s"

Beachten Sie, dass der gmdate()Hack noch kürzer ist, aber nur eine Dauer von bis zu 24 Stunden unterstützt. Alles über 24 Stunden schlägt fehl, wenn Sie den gmdate-Trick verwenden!
GW0

1

Eine einfache Möglichkeit, DateTime dafür zu verwenden, ist:

    $time = 60; //sec.
    $now = time();
    $rep = new DateTime('@'.$now);
    $diff = new DateTime('@'.($now+$time));
    $return = $diff->diff($rep)->format($format);

    //output:  01:04:65

Es ist eine einfache Lösung, mit der Sie die Formatmethode von DateTime verwenden können.


1

In Java können Sie diesen Weg verwenden.

   private String getHmaa(long seconds) {
    String string;
    int hours = (int) seconds / 3600;
    int remainder = (int) seconds - hours * 3600;
    int mins = remainder / 60;
    //remainder = remainder - mins * 60;
    //int secs = remainder;

    if (hours < 12 && hours > 0) {
        if (mins < 10) {
            string = String.valueOf((hours < 10 ? "0" + hours : hours) + ":" + (mins > 0 ? "0" + mins : "0") + " AM");
        } else {
            string = String.valueOf((hours < 10 ? "0" + hours : hours) + ":" + (mins > 0 ? mins : "0") + " AM");
        }
    } else if (hours >= 12) {
        if (mins < 10) {
            string = String.valueOf(((hours - 12) < 10 ? "0" + (hours - 12) : ((hours - 12) == 12 ? "0" : (hours - 12))) + ":" + (mins > 0 ? "0" + mins : "0") + ((hours - 12) == 12 ? " AM" : " PM"));
        } else {
            string = String.valueOf(((hours - 12) < 10 ? "0" + (hours - 12) : ((hours - 12) == 12 ? "0" : (hours - 12))) + ":" + (mins > 0 ? mins : "0") + ((hours - 12) == 12 ? " AM" : " PM"));
        }
    } else {
        if (mins < 10) {
            string = String.valueOf("0" + ":" + (mins > 0 ? "0" + mins : "0") + " AM");
        } else {
            string = String.valueOf("0" + ":" + (mins > 0 ? mins : "0") + " AM");
        }
    }
    return string;
}

0
function timeToSecond($time){
    $time_parts=explode(":",$time);
    $seconds= ($time_parts[0]*86400) + ($time_parts[1]*3600) + ($time_parts[2]*60) + $time_parts[3] ; 
    return $seconds;
}

function secondToTime($time){
    $seconds  = $time % 60;
    $seconds<10 ? "0".$seconds : $seconds;
    if($seconds<10) {
        $seconds="0".$seconds;
    }
    $time     = ($time - $seconds) / 60;
    $minutes  = $time % 60;
    if($minutes<10) {
        $minutes="0".$minutes;
    }
    $time     = ($time - $minutes) / 60;
    $hours    = $time % 24;
    if($hours<10) {
        $hours="0".$hours;
    }
    $days     = ($time - $hours) / 24;
    if($days<10) {
        $days="0".$days;
    }

    $time_arr = array($days,$hours,$minutes,$seconds);
    return implode(":",$time_arr);
}

0

Nun, ich brauchte etwas, das Sekunden in Stunden, Minuten und Sekunden reduziert, aber 24 Stunden überschreitet und nicht weiter in Tage reduziert.

Hier ist eine einfache Funktion, die funktioniert. Sie können es wahrscheinlich verbessern ... Aber hier ist es:

function formatSeconds($seconds)
{
    $hours = 0;$minutes = 0;
    while($seconds >= 60){$seconds -= 60;$minutes++;}
    while($minutes >= 60){$minutes -=60;$hours++;}
    $hours = str_pad($hours, 2, '0', STR_PAD_LEFT);
    $minutes = str_pad($minutes, 2, '0', STR_PAD_LEFT);
    $seconds = str_pad($seconds, 2, '0', STR_PAD_LEFT);
    return $hours.":".$minutes.":".$seconds;
}

0
$given = 685;

 /*
 * In case $given == 86400, gmdate( "H" ) will convert it into '00' i.e. midnight.
 * We would need to take this into consideration, and so we will first
 * check the ratio of the seconds i.e. $given:$number_of_sec_in_a_day
 * and then after multiplying it by the number of hours in a day (24), we
 * will just use "floor" to get the number of hours as the rest would
 * be the minutes and seconds anyways.
 *
 * We can also have minutes and seconds combined in one variable,
 * e.g. $min_sec = gmdate( "i:s", $given );
 * But for versatility sake, I have taken them separately.
 */

$hours = ( $given > 86399 ) ? '0'.floor( ( $given / 86400 ) * 24 )-gmdate( "H", $given ) : gmdate("H", $given );

$min = gmdate( "i", $given );

$sec = gmdate( "s", $given );

echo $formatted_string = $hours.':'.$min.':'.$sec;

So konvertieren Sie es in eine Funktion:

function getHoursFormat( $given ){

 $hours = ( $given > 86399 ) ? '0'.floor( ( $given / 86400 ) * 24 )-gmdate( "H", $given ) : gmdate("H", $given );

 $min = gmdate( "i", $given );

 $sec = gmdate( "s", $given );

 $formatted_string = $hours.':'.$min.':'.$sec;

 return $formatted_string;

}


0

Wenn Sie eine Audio- / Videodauer wie YouTube usw. erstellen möchten, haben Sie folgende Möglichkeiten:

($seconds >= 60) ? ltrim(gmdate("H:i:s", $seconds), ":0") : gmdate("0:s", $seconds)

Gibt Zeichenfolgen zurück wie:

55.55 => '0:55'
100   => '1:40'

Funktioniert wahrscheinlich nicht gut für die Zeit> = 24 Stunden.


0

Dies ist ein hübscher Weg, um das zu tun:

function time_converter($sec_time, $format='h:m:s'){
      $hour = intval($sec_time / 3600) >= 10 ? intval($sec_time / 3600) : '0'.intval($sec_time / 3600);
      $minute = intval(($sec_time % 3600) / 60) >= 10 ? intval(($sec_time % 3600) / 60) : '0'.intval(($sec_time % 3600) / 60);
      $sec = intval(($sec_time % 3600) % 60)  >= 10 ? intval(($sec_time % 3600) % 60) : '0'.intval(($sec_time % 3600) % 60);

      $format = str_replace('h', $hour, $format);
      $format = str_replace('m', $minute, $format);
      $format = str_replace('s', $sec, $format);

      return $format;
    }

-1

Nur für den Fall, dass jemand anderes nach einer einfachen Funktion sucht, um dieses gut formatierte Format zurückzugeben (ich weiß, dass es nicht das Format ist, nach dem das OP gefragt hat), habe ich mir das gerade ausgedacht. Vielen Dank an @mughal für den Code, auf dem dieser basiert.

function format_timer_result($time_in_seconds){
    $time_in_seconds = ceil($time_in_seconds);

    // Check for 0
    if ($time_in_seconds == 0){
        return 'Less than a second';
    }

    // Days
    $days = floor($time_in_seconds / (60 * 60 * 24));
    $time_in_seconds -= $days * (60 * 60 * 24);

    // Hours
    $hours = floor($time_in_seconds / (60 * 60));
    $time_in_seconds -= $hours * (60 * 60);

    // Minutes
    $minutes = floor($time_in_seconds / 60);
    $time_in_seconds -= $minutes * 60;

    // Seconds
    $seconds = floor($time_in_seconds);

    // Format for return
    $return = '';
    if ($days > 0){
        $return .= $days . ' day' . ($days == 1 ? '' : 's'). ' ';
    }
    if ($hours > 0){
        $return .= $hours . ' hour' . ($hours == 1 ? '' : 's') . ' ';
    }
    if ($minutes > 0){
        $return .= $minutes . ' minute' . ($minutes == 1 ? '' : 's') . ' ';
    }
    if ($seconds > 0){
        $return .= $seconds . ' second' . ($seconds == 1 ? '' : 's') . ' ';
    }
    $return = trim($return);

    return $return;
}

-1

Wer dies in Zukunft sucht, gibt dem Format das gewünschte Erstplakat.

$init = 685;
$hours = floor($init / 3600);
$hrlength=strlen($hours);
if ($hrlength==1) {$hrs="0".$hours;}
else {$hrs=$hours;} 

$minutes = floor(($init / 60) % 60);
$minlength=strlen($minutes);
if ($minlength==1) {$mins="0".$minutes;}
else {$mins=$minutes;} 

$seconds = $init % 60;
$seclength=strlen($seconds);
if ($seclength==1) {$secs="0".$seconds;}
else {$secs=$seconds;} 

echo "$hrs:$mins:$secs";

-3
<?php
$time=3*3600 + 30*60;


$year=floor($time/(365*24*60*60));
$time-=$year*(365*24*60*60);

$month=floor($time/(30*24*60*60));
$time-=$month*(30*24*60*60);

$day=floor($time/(24*60*60));
$time-=$day*(24*60*60);

$hour=floor($time/(60*60));
$time-=$hour*(60*60);

$minute=floor($time/(60));
$time-=$minute*(60);

$second=floor($time);
$time-=$second;
if($year>0){
    echo $year." year, ";
}
if($month>0){
    echo $month." month, ";
}
if($day>0){
    echo $day." day, ";
}
if($hour>0){
    echo $hour." hour, ";
}
if($minute>0){
    echo $minute." minute, ";
}
if($second>0){
    echo $second." second, ";
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.