Ubah detik menjadi hari, jam, menit, dan detik

92

Saya ingin mengubah variabel $uptimeyaitu detik, menjadi hari, jam, menit dan detik.

Contoh:

$uptime = 1640467;

Hasilnya harus:

18 days 23 hours 41 minutes
Florian
sumber

Jawaban:

214

Ini bisa dicapai dengan DateTimekelas

Menggunakan:

echo secondsToTime(1640467);
# 18 days, 23 hours, 41 minutes and 7 seconds

Fungsi:

function secondsToTime($seconds) {
    $dtF = new \DateTime('@0');
    $dtT = new \DateTime("@$seconds");
    return $dtF->diff($dtT)->format('%a days, %h hours, %i minutes and %s seconds');
}

demo

Glavić
sumber
@ Glavić Bagaimana saya menambahkan dukungan untuk minggu dan bulan ini?
socca1157
2
Pastikan untuk menambahkan validasi ke fungsi tersebut. if (kosong ($ detik)) {return false;}
kode
4
@ acoder: Saya rasa fungsi ini seharusnya tidak menangani validasi; validasi harus disiapkan sebelum pemanggilan fungsi. Meski demikian, validasi Anda tetap salah, karena misalnya akan melewati alfabet.
Glavić
2
Apa @artinya ketika diteruskan sebagai argumen ke DateTimekonstruktor?
Ivanka Todorova
4
@IvankaTodorova: nilai setelah @adalah stempel waktu unix.
Glavić
44

Ini adalah fungsi yang ditulis ulang untuk memasukkan hari. Saya juga mengubah nama variabel agar kode lebih mudah dipahami ...

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

Sumber: CodeAid () - http://codeaid.net/php/convert-seconds-to-hours-minutes-and-seconds-(php)

Julian Moreno
sumber
Akan menyenangkan untuk memasukkan sumber
Martin.
apakah Anda berbaik hati menambahkan hari ke fungsi ini?
knittledan
@knittledan, tampaknya tidak begitu :)
AO_
1
@ hsmoore.com Saya melanjutkan dan menemukan ini $ hari = lantai ($ detik / (60 * 60 * 24)); // ekstrak jam $ divisor_for_hours = $ detik% (60 * 60 * 24); $ jam = lantai ($ divisor_for_hours / (60 * 60));
knittledan
1
Ini tidak berfungsi seperti yang diharapkan selama berhari-hari. Anda perlu mengurangi ($ hari * 24) dari $ jam, atau jam pada hari tersebut akan dihitung dua kali dalam $ hari dan $ jam. misal masukan 100000 => 1 hari dan 27 jam. Ini harus 1 hari 3 jam.
finiteloop
30

Berdasarkan jawaban Julian Moreno, namun diubah menjadi respon berupa string (bukan array), hanya mencantumkan interval waktu yang diperlukan dan tidak mengasumsikan bentuk jamak.

Perbedaan antara ini dan jawaban pilihan tertinggi adalah:

Untuk beberapa 259264detik, kode ini akan memberi

3 hari, 1 menit, 4 detik

Untuk beberapa 259264detik, jawaban pilihan tertinggi (oleh Glavić) akan diberikan

3 hari, 0 jam , 1 menit dan 4 detik

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

    // Format and return
    $timeParts = [];
    $sections = [
        'day' => (int)$days,
        'hour' => (int)$hours,
        'minute' => (int)$minutes,
        'second' => (int)$seconds,
    ];

    foreach ($sections as $name => $value){
        if ($value > 0){
            $timeParts[] = $value. ' '.$name.($value == 1 ? '' : 's');
        }
    }

    return implode(', ', $timeParts);
}

Saya harap ini membantu seseorang.

Luke Cousins
sumber
1
Saya lebih suka yang ini karena menghapus "s", dari "1 jam", dan, dalam kasus saya, saya ingin menghapus hari dan hanya memiliki hitungan jam yang besar, dan metode ini sangat mudah untuk beradaptasi dengan <3 itu.
Ryan S
1
Luke yang sangat baik, menjaganya tetap kompak dan bersih!
VoidZA
19

Ini dia fungsi PHP 8 baris sederhana yang mengubah beberapa detik menjadi string yang dapat dibaca manusia termasuk jumlah bulan untuk detik yang banyak:

Fungsi PHP detik2human ()

function seconds2human($ss) {
$s = $ss%60;
$m = floor(($ss%3600)/60);
$h = floor(($ss%86400)/3600);
$d = floor(($ss%2592000)/86400);
$M = floor($ss/2592000);

return "$M months, $d days, $h hours, $m minutes, $s seconds";
}
snippetsofcode
sumber
2
Sederhana namun efisien. Meskipun saya tidak suka sedikit 'Bulan'.
Francisco Presencia
1
Anda harus memasukkan kode dalam jawaban Anda, bukan link ke halaman lain. Tidak ada cara untuk memastikan bahwa situs web yang Anda tautkan akan tetap ada besok
Zachary Weixelbaum
11
gmdate("d H:i:s",1640467);

Hasilnya akan menjadi 19 23:41:07. Jika hanya satu detik lebih lama dari hari biasanya, itu meningkatkan nilai hari selama 1 hari. Inilah mengapa ini menunjukkan 19. Anda dapat meledakkan hasil untuk kebutuhan Anda dan memperbaikinya.

Caner SAYGIN
sumber
Anda juga dapat memperbaiki kode ini seperti ini: $uptime = gmdate("y m d H:i:s", 1640467); $uptimeDetail = explode(" ",$uptime); echo (string)($uptimeDetail[0]-70).' year(s) '.(string)($uptimeDetail[1]-1).' month(s) '.(string)($uptimeDetail[2]-1).' day(s) '.(string)$uptimeDetail[3];Ini juga akan memberi Anda informasi tahun dan bulan juga.
Caner SAYGIN
Untuk mencegah kesalahan +1 hari, cukup kurangi (24 * 60 * 60) dari stempel waktu sumber dalam hitungan detik.
andreszs
9

Ada beberapa jawaban yang sangat bagus di sini tetapi tidak satupun yang memenuhi kebutuhan saya. Saya membuat jawaban Glavic untuk menambahkan beberapa fitur tambahan yang saya butuhkan;

  • Jangan mencetak angka nol. Jadi "5 menit" bukan "0 jam, 5 menit"
  • Tangani jamak dengan benar, bukan default ke bentuk jamak.
  • Batasi output ke sejumlah unit tertentu; Jadi, "2 bulan, 2 hari", bukan "2 bulan, 2 hari, 1 jam, 45 menit"

Anda dapat melihat versi kode yang sedang berjalan here.

function secondsToHumanReadable(int $seconds, int $requiredParts = null)
{
    $from     = new \DateTime('@0');
    $to       = new \DateTime("@$seconds");
    $interval = $from->diff($to);
    $str      = '';

    $parts = [
        'y' => 'year',
        'm' => 'month',
        'd' => 'day',
        'h' => 'hour',
        'i' => 'minute',
        's' => 'second',
    ];

    $includedParts = 0;

    foreach ($parts as $key => $text) {
        if ($requiredParts && $includedParts >= $requiredParts) {
            break;
        }

        $currentPart = $interval->{$key};

        if (empty($currentPart)) {
            continue;
        }

        if (!empty($str)) {
            $str .= ', ';
        }

        $str .= sprintf('%d %s', $currentPart, $text);

        if ($currentPart > 1) {
            // handle plural
            $str .= 's';
        }

        $includedParts++;
    }

    return $str;
}
Ramy Nasr
sumber
1
itu sangat membantu saya
Manojkiran.
saya akan membuat fungsi berdasarkan cara in laravel Anda
Manojkiran.
8

Singkat, sederhana, dapat diandalkan:

function secondsToDHMS($seconds) {
    $s = (int)$seconds;
    return sprintf('%d:%02d:%02d:%02d', $s/86400, $s/3600%24, $s/60%60, $s%60);
}
Jérémie Germain
sumber
3
Penjelasan lebih lanjut akan sangat bermanfaat dalam jawaban ini, seperti apa yang direpresentasikan oleh konstanta integer dan bagaimana pemformatan string bekerja dengan sprintf.
1
Saya akan melakukan sprintf ('% dd:% 02dh:% 02dm:% 02ds', $ s / 86400, $ s / 3600% 24, $ s / 60% 60, $ s% 60); hanya untuk menjadi lebih humnan (mis: 0d: 00h: 05m: 00s). Tapi mungkin solusi terbaik disini.
Ricardo Martins
6

Pendekatan paling sederhana adalah membuat metode yang mengembalikan DateInterval dari DateTime :: diff waktu relatif dalam $ detik dari waktu saat ini $ sekarang yang kemudian dapat Anda rantai dan format. Sebagai contoh:-

public function toDateInterval($seconds) {
    return date_create('@' . (($now = time()) + $seconds))->diff(date_create('@' . $now));
}

Sekarang rangkai panggilan metode Anda ke DateInterval :: format

echo $this->toDateInterval(1640467)->format('%a days %h hours %i minutes'));

Hasil:

18 days 23 hours 41 minutes
Trent Renshaw
sumber
3

Meskipun ini pertanyaan yang cukup lama - orang mungkin menganggap ini berguna (tidak ditulis untuk menjadi cepat):

function d_h_m_s__string1($seconds)
{
    $ret = '';
    $divs = array(86400, 3600, 60, 1);

    for ($d = 0; $d < 4; $d++)
    {
        $q = (int)($seconds / $divs[$d]);
        $r = $seconds % $divs[$d];
        $ret .= sprintf("%d%s", $q, substr('dhms', $d, 1));
        $seconds = $r;
    }

    return $ret;
}

function d_h_m_s__string2($seconds)
{
    if ($seconds == 0) return '0s';

    $can_print = false; // to skip 0d, 0d0m ....
    $ret = '';
    $divs = array(86400, 3600, 60, 1);

    for ($d = 0; $d < 4; $d++)
    {
        $q = (int)($seconds / $divs[$d]);
        $r = $seconds % $divs[$d];
        if ($q != 0) $can_print = true;
        if ($can_print) $ret .= sprintf("%d%s", $q, substr('dhms', $d, 1));
        $seconds = $r;
    }

    return $ret;
}

function d_h_m_s__array($seconds)
{
    $ret = array();

    $divs = array(86400, 3600, 60, 1);

    for ($d = 0; $d < 4; $d++)
    {
        $q = $seconds / $divs[$d];
        $r = $seconds % $divs[$d];
        $ret[substr('dhms', $d, 1)] = $q;

        $seconds = $r;
    }

    return $ret;
}

echo d_h_m_s__string1(0*86400+21*3600+57*60+13) . "\n";
echo d_h_m_s__string2(0*86400+21*3600+57*60+13) . "\n";

$ret = d_h_m_s__array(9*86400+21*3600+57*60+13);
printf("%dd%dh%dm%ds\n", $ret['d'], $ret['h'], $ret['m'], $ret['s']);

hasil:

0d21h57m13s
21h57m13s
9d21h57m13s
Artur
sumber
3
function seconds_to_time($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);

    //create string HH:MM:SS
    $ret = $hours.":".$minutes.":".$seconds;
    return($ret);
}
James Doherty
sumber
1
Anda melewatkan hari
Sam Tuke
3
function convert($seconds){
$string = "";

$days = intval(intval($seconds) / (3600*24));
$hours = (intval($seconds) / 3600) % 24;
$minutes = (intval($seconds) / 60) % 60;
$seconds = (intval($seconds)) % 60;

if($days> 0){
    $string .= "$days days ";
}
if($hours > 0){
    $string .= "$hours hours ";
}
if($minutes > 0){
    $string .= "$minutes minutes ";
}
if ($seconds > 0){
    $string .= "$seconds seconds";
}

return $string;
}

echo convert(3744000);
Madushanka Sampath
sumber
2

Solusi yang harus mengecualikan nilai 0 dan menetapkan nilai tunggal / jamak yang benar

use DateInterval;
use DateTime;

class TimeIntervalFormatter
{

    public static function fromSeconds($seconds)
    {
        $seconds = (int)$seconds;
        $dateTime = new DateTime();
        $dateTime->sub(new DateInterval("PT{$seconds}S"));
        $interval = (new DateTime())->diff($dateTime);
        $pieces = explode(' ', $interval->format('%y %m %d %h %i %s'));
        $intervals = ['year', 'month', 'day', 'hour', 'minute', 'second'];
        $result = [];
        foreach ($pieces as $i => $value) {
            if (!$value) {
                continue;
            }
            $periodName = $intervals[$i];
            if ($value > 1) {
                $periodName .= 's';
            }
            $result[] = "{$value} {$periodName}";
        }
        return implode(', ', $result);
    }
}
radzserg.dll
sumber
1

versi diperpanjang dari solusi luar biasa Glavić , memiliki validasi bilangan bulat, menyelesaikan masalah 1, dan dukungan tambahan selama bertahun-tahun, dengan mengorbankan komputer yang kurang ramah parsing demi menjadi lebih ramah manusia:

<?php
function secondsToHumanReadable(/*int*/ $seconds)/*: string*/ {
    //if you dont need php5 support, just remove the is_int check and make the input argument type int.
    if(!\is_int($seconds)){
        throw new \InvalidArgumentException('Argument 1 passed to secondsToHumanReadable() must be of the type int, '.\gettype($seconds).' given');
    }
    $dtF = new \DateTime ( '@0' );
    $dtT = new \DateTime ( "@$seconds" );
    $ret = '';
    if ($seconds === 0) {
        // special case
        return '0 seconds';
    }
    $diff = $dtF->diff ( $dtT );
    foreach ( array (
            'y' => 'year',
            'm' => 'month',
            'd' => 'day',
            'h' => 'hour',
            'i' => 'minute',
            's' => 'second' 
    ) as $time => $timename ) {
        if ($diff->$time !== 0) {
            $ret .= $diff->$time . ' ' . $timename;
            if ($diff->$time !== 1 && $diff->$time !== -1 ) {
                $ret .= 's';
            }
            $ret .= ' ';
        }
    }
    return substr ( $ret, 0, - 1 );
}

var_dump(secondsToHumanReadable(1*60*60*2+1)); -> string(16) "2 hours 1 second"

hanshenrik
sumber
1

Kelas interval yang saya tulis dapat digunakan. Ini bisa digunakan dengan cara yang berlawanan juga.

composer require lubos/cakephp-interval

$Interval = new \Interval\Interval\Interval();

// output 2w 6h
echo $Interval->toHuman((2 * 5 * 8 + 6) * 3600);

// output 36000
echo $Interval->toSeconds('1d 2h');

Info lebih lanjut di sini https://github.com/LubosRemplik/CakePHP-Interval

Luboš Remplík
sumber
1

Dengan DateInterval :

$d1 = new DateTime();
$d2 = new DateTime();
$d2->add(new DateInterval('PT'.$timespan.'S'));

$interval = $d2->diff($d1);
echo $interval->format('%a days, %h hours, %i minutes and %s seconds');

// Or
echo sprintf('%d days, %d hours, %d minutes and %d seconds',
    $interval->days,
    $interval->h,
    $interval->i,
    $interval->s
);

// $interval->y => years
// $interval->m => months
// $interval->d => days
// $interval->h => hours
// $interval->i => minutes
// $interval->s => seconds
// $interval->days => total number of days
Zayon
sumber
0

Berikut beberapa kode yang saya gunakan untuk mendapatkan durasi antara dua tanggal. Ini menerima dua tanggal dan memberi Anda jawaban terstruktur kalimat yang bagus.

Ini adalah versi kode yang sedikit dimodifikasi yang ditemukan di sini .

<?php

function dateDiff($time1, $time2, $precision = 6, $offset = false) {

    // If not numeric then convert texts to unix timestamps

    if (!is_int($time1)) {
            $time1 = strtotime($time1);
    }

    if (!is_int($time2)) {
            if (!$offset) {
                    $time2 = strtotime($time2);
            }
            else {
                    $time2 = strtotime($time2) - $offset;
            }
    }

    // If time1 is bigger than time2
    // Then swap time1 and time2

    if ($time1 > $time2) {
            $ttime = $time1;
            $time1 = $time2;
            $time2 = $ttime;
    }

    // Set up intervals and diffs arrays

    $intervals = array(
            'year',
            'month',
            'day',
            'hour',
            'minute',
            'second'
    );
    $diffs = array();

    // Loop thru all intervals

    foreach($intervals as $interval) {

            // Create temp time from time1 and interval

            $ttime = strtotime('+1 ' . $interval, $time1);

            // Set initial values

            $add = 1;
            $looped = 0;

            // Loop until temp time is smaller than time2

            while ($time2 >= $ttime) {

                    // Create new temp time from time1 and interval

                    $add++;
                    $ttime = strtotime("+" . $add . " " . $interval, $time1);
                    $looped++;
            }

            $time1 = strtotime("+" . $looped . " " . $interval, $time1);
            $diffs[$interval] = $looped;
    }

    $count = 0;
    $times = array();

    // Loop thru all diffs

    foreach($diffs as $interval => $value) {

            // Break if we have needed precission

            if ($count >= $precision) {
                    break;
            }

            // Add value and interval
            // if value is bigger than 0

            if ($value > 0) {

                    // Add s if value is not 1

                    if ($value != 1) {
                            $interval.= "s";
                    }

                    // Add value and interval to times array

                    $times[] = $value . " " . $interval;
                    $count++;
            }
    }

    if (!empty($times)) {

            // Return string with times

            return implode(", ", $times);
    }
    else {

            // Return 0 Seconds

    }

    return '0 Seconds';
}

Sumber: https://gist.github.com/ozh/8169202

Mike Johanning
sumber
0

Semua dalam satu solusi. Tidak memberikan unit dengan nol. Hanya akan menghasilkan jumlah unit yang Anda tentukan (3 secara default). Cukup panjang, mungkin tidak terlalu elegan. Definisi bersifat opsional, tetapi mungkin berguna dalam proyek besar.

define('OneMonth', 2592000);
define('OneWeek', 604800);  
define('OneDay', 86400);
define('OneHour', 3600);    
define('OneMinute', 60);

function SecondsToTime($seconds, $num_units=3) {        
    $time_descr = array(
                "months" => floor($seconds / OneMonth),
                "weeks" => floor(($seconds%OneMonth) / OneWeek),
                "days" => floor(($seconds%OneWeek) / OneDay),
                "hours" => floor(($seconds%OneDay) / OneHour),
                "mins" => floor(($seconds%OneHour) / OneMinute),
                "secs" => floor($seconds%OneMinute),
                );  

    $res = "";
    $counter = 0;

    foreach ($time_descr as $k => $v) {
        if ($v) {
            $res.=$v." ".$k;
            $counter++;
            if($counter>=$num_units)
                break;
            elseif($counter)
                $res.=", ";             
        }
    }   
    return $res;
}

Jangan ragu untuk memberikan suara negatif, tetapi pastikan untuk mencobanya di kode Anda. Mungkin itu yang Anda butuhkan.

AnDenix
sumber
0

Solusi untuk yang ini saya gunakan (kembali ke hari-hari saat belajar PHP) tanpa fungsi apa pun:

$days = (int)($uptime/86400); //1day = 86400seconds
$rdays = (uptime-($days*86400)); 
//seconds remaining after uptime was converted into days
$hours = (int)($rdays/3600);//1hour = 3600seconds,converting remaining seconds into hours
$rhours = ($rdays-($hours*3600));
//seconds remaining after $rdays was converted into hours
$minutes = (int)($rhours/60); // 1minute = 60seconds, converting remaining seconds into minutes
echo "$days:$hours:$minutes";

Meskipun ini adalah pertanyaan lama, pelajar baru yang menemukan ini, mungkin menemukan jawaban ini berguna.

RentanBoy
sumber
0
a=int(input("Enter your number by seconds "))
d=a//(24*3600)   #Days
h=a//(60*60)%24  #hours
m=a//60%60       #minutes
s=a%60           #seconds
print("Days ",d,"hours ",h,"minutes ",m,"seconds ",s)
Malk Ghassan
sumber
0

Saya mengedit salah satu kode agar berfungsi dengan baik ketika nilai negatif datang. floor()fungsi tidak memberikan hitungan yang benar ketika nilainya negatif. Jadi kita perlu menggunakan abs()fungsi sebelum menggunakannya di dalam floor()fungsi. $inputSecondsvariabel dapat menjadi perbedaan antara cap waktu saat ini dan tanggal yang diperlukan.

/** 
 * 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 = abs($inputSeconds / $secondsInADay);
    $days = floor($days);

    // extract hours
    $hourSeconds = $inputSeconds % $secondsInADay;
    $hours = abs($hourSeconds / $secondsInAnHour);
    $hours = floor($hours);

    // extract minutes
    $minuteSeconds = $hourSeconds % $secondsInAnHour;
    $minutes = abs($minuteSeconds / $secondsInAMinute);
    $minutes = floor($minutes);

    // extract the remaining seconds
    $remainingSeconds = $minuteSeconds % $secondsInAMinute;
    $seconds = abs($remainingSeconds);
    $seconds = ceil($remainingSeconds);

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

Variasi jawaban @ Glavić - yang satu ini menyembunyikan angka nol di depan untuk hasil yang lebih singkat dan menggunakan bentuk jamak di tempat yang benar. Ini juga menghilangkan ketepatan yang tidak perlu (misalnya jika perbedaan waktu lebih dari 2 jam, Anda mungkin tidak peduli berapa menit atau detik).

function secondsToTime($seconds)
{
    $dtF = new \DateTime('@0');
    $dtT = new \DateTime("@$seconds");
    $dateInterval = $dtF->diff($dtT);
    $days_t = 'day';
    $hours_t = 'hour';
    $minutes_t = 'minute';
    $seconds_t = 'second';
    if ((int)$dateInterval->d > 1) {
        $days_t = 'days';
    }
    if ((int)$dateInterval->h > 1) {
        $hours_t = 'hours';
    }
    if ((int)$dateInterval->i > 1) {
        $minutes_t = 'minutes';
    }
    if ((int)$dateInterval->s > 1) {
        $seconds_t = 'seconds';
    }


    if ((int)$dateInterval->d > 0) {
        if ((int)$dateInterval->d > 1 || (int)$dateInterval->h === 0) {
            return $dateInterval->format("%a $days_t");
        } else {
            return $dateInterval->format("%a $days_t, %h $hours_t");
        }
    } else if ((int)$dateInterval->h > 0) {
        if ((int)$dateInterval->h > 1 || (int)$dateInterval->i === 0) {
            return $dateInterval->format("%h $hours_t");
        } else {
            return $dateInterval->format("%h $hours_t, %i $minutes_t");
        }
    } else if ((int)$dateInterval->i > 0) {
        if ((int)$dateInterval->i > 1 || (int)$dateInterval->s === 0) {
            return $dateInterval->format("%i $minutes_t");
        } else {
            return $dateInterval->format("%i $minutes_t, %s $seconds_t");
        }
    } else {
        return $dateInterval->format("%s $seconds_t");
    }

}
php > echo secondsToTime(60);
1 minute
php > echo secondsToTime(61);
1 minute, 1 second
php > echo secondsToTime(120);
2 minutes
php > echo secondsToTime(121);
2 minutes
php > echo secondsToTime(2000);
33 minutes
php > echo secondsToTime(4000);
1 hour, 6 minutes
php > echo secondsToTime(4001);
1 hour, 6 minutes
php > echo secondsToTime(40001);
11 hours
php > echo secondsToTime(400000);
4 days
Mike Furlender
sumber
0

Saya tidak tahu mengapa beberapa dari jawaban ini sangat panjang atau rumit. Ini salah satu yang menggunakan Kelas DateTime . Mirip dengan jawaban radzserg. Ini hanya akan menampilkan unit yang diperlukan, dan waktu negatif akan memiliki akhiran 'lalu' ...

function calctime($seconds = 0) {

    $datetime1 = date_create("@0");
    $datetime2 = date_create("@$seconds");
    $interval = date_diff($datetime1, $datetime2);

    if ( $interval->y >= 1 ) $thetime[] = pluralize( $interval->y, 'year' );
    if ( $interval->m >= 1 ) $thetime[] = pluralize( $interval->m, 'month' );
    if ( $interval->d >= 1 ) $thetime[] = pluralize( $interval->d, 'day' );
    if ( $interval->h >= 1 ) $thetime[] = pluralize( $interval->h, 'hour' );
    if ( $interval->i >= 1 ) $thetime[] = pluralize( $interval->i, 'minute' );
    if ( $interval->s >= 1 ) $thetime[] = pluralize( $interval->s, 'second' );

    return isset($thetime) ? implode(' ', $thetime) . ($interval->invert ? ' ago' : '') : NULL;
}

function pluralize($count, $text) {
    return $count . ($count == 1 ? " $text" : " ${text}s");
}

// Examples:
//    -86400 = 1 day ago
//     12345 = 3 hours 25 minutes 45 seconds
// 987654321 = 31 years 3 months 18 days 4 hours 25 minutes 21 seconds

EDIT: Jika Anda ingin menyingkat contoh di atas untuk menggunakan lebih sedikit variabel / ruang (dengan mengorbankan keterbacaan), berikut adalah versi alternatif yang melakukan hal yang sama:

function calctime($seconds = 0) {
    $interval = date_diff(date_create("@0"),date_create("@$seconds"));

    foreach (array('y'=>'year','m'=>'month','d'=>'day','h'=>'hour','i'=>'minute','s'=>'second') as $format=>$desc) {
        if ($interval->$format >= 1) $thetime[] = $interval->$format . ($interval->$format == 1 ? " $desc" : " {$desc}s");
    }

    return isset($thetime) ? implode(' ', $thetime) . ($interval->invert ? ' ago' : '') : NULL;
}
Jason
sumber
Anda mungkin ingin menambahkan keamanan ke fungsi waktu kalkulasi untuk melindungi dari 0 detik. Kode saat ini membuat kesalahan. Bungkus $thetimedalam pengembalian, misalnya,isset($thetime)
Stargazing Worm
Terima kasih atas sarannya, Anda benar tentang kesalahannya (Saya tidak percaya saya melewatkannya). Saya telah memperbarui kode yang sesuai!
Jason
-1
foreach ($email as $temp => $value) {
    $dat = strtotime($value['subscription_expiration']); //$value come from mysql database
//$email is an array from mysqli_query()
    $date = strtotime(date('Y-m-d'));

    $_SESSION['expiry'] = (((($dat - $date)/60)/60)/24)." Days Left";
//you will get the difference from current date in days.
}

$ value berasal dari Database. Kode ini ada di Codeigniter. $ SESSION digunakan untuk menyimpan langganan pengguna. itu wajib. Saya menggunakannya dalam kasus saya, Anda dapat menggunakan apa pun yang Anda inginkan.

Tayyab Hayat
sumber
1
Bisakah Anda menambahkan lebih banyak penjelasan ke kode Anda? Dari mana $valueasalnya Mengapa Anda ingin memperkenalkan sesi? Bagaimana ini mengembalikan string yang tepat untuk detik, menit, dan jam?
Nico Haase
@NicoHaase jawaban Diperbarui.
Tayyab Hayat
-2

Ini adalah fungsi yang saya gunakan di masa lalu untuk mengurangi tanggal dari tanggal lain yang terkait dengan pertanyaan Anda, prinsip saya adalah mendapatkan berapa hari, jam menit, dan detik yang tersisa hingga produk kedaluwarsa:

$expirationDate = strtotime("2015-01-12 20:08:23");
$toDay = strtotime(date('Y-m-d H:i:s'));
$difference = abs($toDay - $expirationDate);
$days = floor($difference / 86400);
$hours = floor(($difference - $days * 86400) / 3600);
$minutes = floor(($difference - $days * 86400 - $hours * 3600) / 60);
$seconds = floor($difference - $days * 86400 - $hours * 3600 - $minutes * 60);

echo "{$days} days {$hours} hours {$minutes} minutes {$seconds} seconds";
Krazii KiiD
sumber
bagaimana cara mendapatkan jumlah minggu juga? contoh: 5 detik, 1 jam, 3 hari, 2 minggu, 1 bulan
Stackoverflow