Konversi detik ke Jam: Menit: Kedua


330

Saya perlu mengonversi detik ke "Jam: Menit: Kedua".

Misalnya: "685" dikonversi menjadi "00:11:25"

Bagaimana saya bisa mencapai ini?


4
pertanyaannya mendua: Anda ingin mengonversi Anda secondske date/timeatau ke sejumlah Jam: Menit: Detik?
WonderLand

Jawaban:


741

Anda dapat menggunakan gmdate()fungsi ini:

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

166
Lebih baik pastikan jumlah detik di bawah 86.400.
salathe

12
H mewakili jumlah jam dalam satu hari. Jadi, jika Anda memiliki 90000 detik dan Anda akan menggunakan H hasilnya adalah 01 (jam pertama hari berikutnya). BUKAN 25 - hanya ada 24 jam dalam sehari.
MarcinWolny

7
Saya tidak yakin ini adalah jawaban yang tepat, ini akan menghasilkan datetime... jadi jika kita mengharapkan hasil> 24 jam itu tidak akan berfungsi. Juga jika kita memerlukan beberapa hasil negatif (misalnya bekerja dengan offset) itu tidak akan berfungsi. -1untuk rincian detail
WonderLand

54
Ini seharusnya bukan jawaban yang diterima karena cacat yang jelas untuk waktu yang lebih besar dari 24 jam.
Scott Flack

10
Untuk digunakan dengan hari-hari di mana angkanya mungkin lebih besar dari 85399 Anda dapat menggunakan echo gmdate("z H:i:s", 685);z adalah jumlah hari dalam tahun dimulai dengan 0. Anda jelas dapat meninjau manual tanggal php untuk memenuhi kebutuhan spesifik Anda.
Nightwolf

177

Satu jam adalah 3600sec, satu menit adalah 60sec jadi mengapa tidak:

<?php

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

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

?>

yang menghasilkan:

$ php file.php
0:11:25

(Saya belum menguji sebanyak ini, jadi mungkin ada kesalahan dengan lantai atau lebih)


Tapi dia ingin dua angka nol ... "00:11:25" bukan "0:11:25"
animuson

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

5
Jawaban yang bagus, tetapi pastikan Anda mengurangi $ jam * 3600 dan $ menit * 60 dari $ init di antara setiap operasi jika tidak, Anda akan berakhir dengan penghitungan ganda menit dan detik.
Mike Stowe

5
Untuk menambah komentar @ Amber, gunakan sprintfuntuk mengembalikan nilai alih-alih mencetaknya.
Allen Butler

77

ini dia

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
Tidak berfungsi untuk nilai negatif. Jika Anda memiliki interval detik negatif, gunakan ini:return ($t< 0 ? '-' : '') . sprintf("%02d%s%02d%s%02d", floor(abs($t)/3600), $f, (abs($t)/60)%60, $f, abs($t)%60); }
Ajax

66

Gunakan fungsi gmdate() hanya jika detik kurang dari 86400(1 hari) :

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

Lihat: gmdate ()

Jalankan Demo


Konversi detik ke format dengan 'kaki' tanpa batas * :

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

Lihat: floor () , sprintf () , operator aritmatika

Jalankan Demo


Contoh penggunaan DateTimeekstensi:

$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

Lihat: DateTime :: __ construct () , DateTime :: memodifikasi () , clone , sprintf ()

Jalankan Demo


Rentang-838:59:59838:59:59 contoh MySQL dari hasil dibatasi dengan tipe data TIME, yaitu dari hingga :

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

Lihat: SEC_TO_TIME

Jalankan Demo


Contoh PostgreSQL:

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

Jalankan Demo


30

Solusi lain digunakan gmdate, tetapi gagal dalam kasus tepi di mana Anda memiliki lebih dari 86400 detik. Untuk menyiasatinya, kita cukup menghitung sendiri jumlah jam, lalu gmdatemenghitung detik yang tersisa menjadi menit / detik.

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

Input: 6030 Keluaran:1:40:30

Input: 2000006030 Keluaran: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); itu tidak cukup untuk mendapatkan Day-Hour-Min-Sec
mughal

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

Tidak akan memberikan waktu dalam H:i:sformat jika no_of_secondslebih dari 1 hari (detik dalam sehari).
Ini akan mengabaikan nilai hari dan hanya memberiHour:Min:Seconds

Sebagai contoh:

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

6

Berikut ini adalah satu liner yang menangani detik negatif dan bernilai lebih dari 1 hari.

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

Sebagai contoh:

$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));

keluaran: -26: 03: 04


tidak akan berfungsi jika negatif dan kurang dari 1 jam: -3000 = 0:50:00 seharusnya -0: 50: 00
Tony Brix

6

Jika Anda tidak menyukai jawaban yang diterima atau yang populer, cobalah yang ini

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

5

tulis fungsi seperti ini untuk mengembalikan array

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;
}

maka cukup panggil fungsi seperti ini:

secondsToTime(100);

output adalah

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

4

Lihat:

    /** 
     * 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;
    }

Dari: Konversi detik menjadi hari, jam, menit, dan detik


3

Coba ini:

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

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


Tidak sepenuhnya yakin, tapi saya cukup yakin itu mengatur waktu ke 0 dan kemudian apa pun di atas itu hanya akan menjadi jawaban yang benar
Kerry Jones

Ini menempatkan 0 di depan menit, yang tidak dapat Anda sesuaikan dengan date () - ca.php.net/manual/en/function.date.php
barfoon

@ barfoon - benar, tapi saya percaya inilah yang diminta M.Ezz, dan ini adalah standar yang digunakan dalam waktu. Ini terlihat aneh dari pengalaman saya "3: 7: 5" bukannya "03:07:05", atau bahkan "3: 7", lebih mirip rasio bagi saya.
Kerry Jones

3

Fungsi gmtdate () tidak berfungsi untuk saya karena saya melacak jam kerja di proyek dan jika lebih dari 24 jam, Anda mendapatkan jumlah yang tersisa setelah 24 jam dikurangi. Dengan kata lain 37 jam menjadi 13 jam. (semua seperti yang dinyatakan di atas oleh Glavic - terima kasih atas contoh Anda!) Yang ini bekerja dengan baik:

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

Fungsi ini bermanfaat, Anda dapat memperluasnya:

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

Solusi dari: https://gist.github.com/SteveJobzniak/c91a8e2426bac5cb9b0cbc1bdbc45e4b

Ini metode yang sangat bersih dan singkat!

Kode ini menghindari sebanyak mungkin pemanggilan fungsi yang membosankan dan pembangunan string sepotong demi sepotong, dan fungsi besar dan besar yang dibuat orang untuk ini.

Ini menghasilkan format "1h05m00s" dan menggunakan nol terkemuka untuk menit dan detik, selama komponen waktu non-nol mendahului mereka.

Dan itu melompati semua komponen utama yang kosong untuk menghindari memberi Anda informasi yang tidak berguna seperti "0h00m01s" (sebagai gantinya itu akan muncul sebagai "1s").

Contoh hasil: "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'; }

Jika Anda ingin membuat kode lebih pendek (tetapi kurang dapat dibaca), Anda dapat menghindari $convertedarray dan meletakkan nilai-nilai secara langsung dalam panggilan sprintf (), sebagai berikut:

$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'; }

Durasi harus 0 atau lebih tinggi di kedua potongan kode di atas. Durasi negatif tidak didukung. Tetapi Anda dapat menangani durasi negatif dengan menggunakan kode alternatif berikut sebagai gantinya:

$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"

Perhatikan bahwa gmdate()peretasan bahkan lebih pendek dari ini, tetapi hanya mendukung durasi hingga 24 jam. Apa pun di atas 24 jam akan gagal jika Anda menggunakan trik gmdate!
gw0

1

Cara sederhana untuk menggunakan DateTime untuk ini adalah:

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

    //output:  01:04:65

Ini adalah solusi sederhana yang memberi Anda kemampuan untuk menggunakan format Metode DateTime.


1

Di java Anda bisa menggunakan cara ini.

   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

Yah saya membutuhkan sesuatu yang akan mengurangi detik menjadi beberapa jam menit dan detik, tetapi akan melebihi 24 jam, dan tidak mengurangi turun menjadi beberapa hari.

Berikut adalah fungsi sederhana yang berfungsi. Anda mungkin dapat memperbaikinya ... Tapi ini dia:

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;

Untuk mengubahnya menjadi fungsi:

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

Jika Anda ingin membuat string durasi audio / video seperti YouTube, dll. Anda dapat melakukannya:

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

Akan mengembalikan string seperti:

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

Mungkin tidak akan bekerja dengan baik untuk waktu> = 24 jam.


0

Ini cara yang bagus untuk melakukan itu:

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

Kalau-kalau ada orang lain yang mencari fungsi sederhana untuk mengembalikan ini diformat dengan baik (saya tahu itu bukan format OP meminta), ini adalah apa yang baru saja saya buat. Berkat @mughal untuk kode ini didasarkan pada.

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

Siapa pun yang mencari ini di masa depan, ini memberikan format yang diminta oleh poster awal.

$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, ";
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.