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?

SAYA
sumber
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);
animuson
sumber
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)

Aif
sumber
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
nathan
sumber
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

Glavić
sumber
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

RaDim
sumber
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
mughal
sumber
$ 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
Vikash Kumar
sumber
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

Benjamin
sumber
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
Eranda
sumber
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 )
vamsikrishnamannem
sumber
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

FooBar
sumber
3

Coba ini:

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

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

Kerry Jones
sumber
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
TotalPro
sumber
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;}
AMCoded
sumber
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"
gw0
sumber
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.

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

sumber
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);
}
anu g prem
sumber
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;
}
Paul Ishak
sumber
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;

}
Brajinder Singh
sumber
0

Jika Anda perlu melakukannya dalam javascript, Anda dapat melakukannya hanya dalam satu baris kode seperti yang dijawab di sini. Konversi detik menjadi HH-MM-SS dengan JavaScript . Ganti DETIK dengan apa yang ingin Anda konversi.

var time = new Date(SECONDS * 1000).toISOString().substr(11, 8);
icynets
sumber
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.

Keith Turkowski
sumber
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;
    }
iamousseni
sumber
-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;
}
Luke Cousins
sumber
-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";
Gordon
sumber
-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, ";
}
Ibrahim Akbar
sumber