Chuyển đổi giây thành ngày, giờ, phút và giây


92

Tôi muốn chuyển đổi một biến $uptimelà giây, thành ngày, giờ, phút và giây.

Thí dụ:

$uptime = 1640467;

Kết quả phải là:

18 days 23 hours 41 minutes

Câu trả lời:


214

Điều này có thể đạt được với DateTimelớp

Sử dụng:

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

Chức năng:

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ć Tôi làm cách nào để thêm hỗ trợ tuần và tháng cho việc này?
socca1157

2
Hãy chắc chắn thêm xác nhận vào chức năng. if (trống ($ giây)) {return false;}
một lập trình viên

4
@acoder: Tôi nghĩ rằng chức năng này không nên quan tâm đến việc xác thực; xác nhận nên được thiết lập trước khi gọi hàm. Tuy nhiên, xác thực của bạn vẫn sai, vì ví dụ, nó cũng sẽ vượt qua bảng chữ cái.
Glavić

2
Ý @nghĩa của nó khi được truyền như một đối số cho hàm DateTimetạo?
Ivanka Todorova

4
@IvankaTodorova: giá trị sau @là dấu thời gian unix.
Glavić

44

Đây là hàm được viết lại để bao gồm các ngày. Tôi cũng đã thay đổi tên biến để làm cho mã dễ hiểu hơn ...

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

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


Sẽ rất tốt nếu bao gồm nguồn
Martin.

bạn có đủ tử tế để thêm ngày vào chức năng này không?
jerttledan

@knittledan, không xuất hiện như vậy :)
AO_

1
@ hsmoore.com Tôi đã tiếp tục và tìm ra điều này $ days = floor ($ seconds / (60 * 60 * 24)); // giải nén giờ $ divisor_for_hours = $ seconds% (60 * 60 * 24); $ hours = floor ($ divisor_for_hours / (60 * 60));
harttledan

1
Điều này không hoạt động như mong đợi trong nhiều ngày. Bạn cần trừ ($ ngày * 24) cho $ giờ, nếu không số giờ trong ngày sẽ được tính gấp đôi trong $ ngày và $ giờ. ví dụ đầu vào 100000 => 1 ngày 27 giờ. Đây sẽ là 1 ngày và 3 giờ.
finiteloop

30

Dựa trên câu trả lời của Julian Moreno, nhưng đã thay đổi để đưa ra phản hồi dưới dạng chuỗi (không phải mảng), chỉ bao gồm các khoảng thời gian cần thiết và không giả sử là số nhiều.

Sự khác biệt giữa câu trả lời này và câu trả lời được bình chọn cao nhất là:

Trong 259264vài giây, mã này sẽ cung cấp

3 ngày, 1 phút, 4 giây

Trong 259264vài giây, câu trả lời được bình chọn cao nhất (bởi Glavić) sẽ cho

3 ngày, 0 giờ , 1 phút giây và 4 giây

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

Tôi hi vọng điêu nay se giup được ai đo.


1
Tôi thích phương pháp này hơn vì nó loại bỏ "s" khỏi "1 giờ" và trong trường hợp của tôi, tôi muốn xóa ngày và chỉ có số giờ lớn và phương pháp này rất dễ dàng để thích ứng với điều đó <3.
Ryan S

1
Luke rất tốt, giữ cho nó nhỏ gọn và sạch sẽ!
VoidZA

19

Đây là một hàm PHP 8 dòng đơn giản có thể chuyển đổi một số giây thành một chuỗi mà con người có thể đọc được bao gồm số tháng cho một lượng lớn giây:

Hàm PHP seconds2human ()

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

2
Đơn giản nhưng hiệu quả. Mặc dù tôi không thích 'Tháng' một chút.
Francisco Presencia

1
Bạn nên bao gồm mã trong câu trả lời của mình, không liên kết đến trang khác. Không có cách nào để xác định rằng các trang web mà bạn đang liên kết vẫn sẽ ở đó vào ngày mai
Zachary Weixelbaum

11
gmdate("d H:i:s",1640467);

Kết quả sẽ là 19 23:41:07. Khi nó chỉ hơn một giây so với ngày bình thường, nó đang tăng giá trị ngày trong 1 ngày. Đây là lý do tại sao nó hiển thị 19. Bạn có thể bùng nổ kết quả theo nhu cầu của mình và sửa lỗi này.


Bạn cũng có thể cải thiện mã này như sau: $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];Điều này cũng sẽ cung cấp cho bạn thông tin năm và tháng.
Caner SAYGIN

Để ngăn lỗi +1 ngày, chỉ cần trừ (24 * 60 * 60) khỏi dấu thời gian nguồn trong vài giây.
andreszs

9

Có một số câu trả lời rất hay ở đây nhưng không có câu trả lời nào trong số đó đáp ứng được nhu cầu của tôi. Tôi đã xây dựng trên câu trả lời của Glavic để thêm một số tính năng bổ sung mà tôi cần;

  • Không in số không. Vì vậy, "5 phút" thay vì "0 giờ, 5 phút"
  • Xử lý số nhiều đúng cách thay vì mặc định ở dạng số nhiều.
  • Giới hạn đầu ra ở một số đơn vị nhất định; Vì vậy, "2 tháng, 2 ngày" thay vì "2 tháng, 2 ngày, 1 giờ, 45 phút"

Bạn có thể thấy phiên bản đang chạy của mã 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;
}

1
nó đã giúp tôi rất nhiều
Manojkiran.

tôi sẽ tạo chức năng dựa trên cách của bạn
Manojkiran.

8

Ngắn gọn, đơn giản, đáng tin cậy:

function secondsToDHMS($seconds) {
    $s = (int)$seconds;
    return sprintf('%d:%02d:%02d:%02d', $s/86400, $s/3600%24, $s/60%60, $s%60);
}

3
Giải thích sâu hơn sẽ đi một đoạn dài trong câu trả lời này, chẳng hạn như những gì các hằng số nguyên đại diện và cách định dạng chuỗi hoạt động với sprintf.

1
Tôi sẽ chạy sprintf ('% dd:% 02dh:% 02dm:% 02ds', $ s / 86400, $ s / 3600% 24, $ s / 60% 60, $ s% 60); chỉ để trở nên hài hước hơn (ví dụ: 0d: 00h: 05m: 00s). Nhưng có lẽ giải pháp tốt nhất ở đây.
Ricardo Martins

6

Cách tiếp cận đơn giản nhất sẽ là tạo một phương thức trả về DateInterval từ DateTime :: diff của thời gian tương đối trong $ giây so với thời điểm hiện tại $ bây giờ mà sau đó bạn có thể xâu chuỗi và định dạng. Ví dụ:-

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

Bây giờ chuỗi cuộc gọi phương thức của bạn thành định dạng DateInterval ::

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

Kết quả:

18 days 23 hours 41 minutes

3

Mặc dù đây là câu hỏi khá cũ - người ta có thể thấy những điều này hữu ích (không được viết nhanh):

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

kết quả:

0d21h57m13s
21h57m13s
9d21h57m13s

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

1
Bạn đang bỏ lỡ những ngày
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);

2

Giải pháp nên loại trừ các giá trị 0 và đặt các giá trị số ít / số nhiều chính xác

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

1

một phiên bản mở rộng của giải pháp tuyệt vời của Glavić , có xác thực số nguyên, giải quyết vấn đề 1 s và hỗ trợ bổ sung trong nhiều năm và nhiều tháng, với chi phí ít thân thiện với máy tính phân tích cú pháp hơn để thân thiện với con người hơn:

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


1

Lớp ngắt quãng tôi đã viết có thể được sử dụng. Nó cũng có thể được sử dụng theo cách ngược lại.

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

Thông tin thêm tại đây https://github.com/LubosRemplik/CakePHP-Interval


1

Với 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

0

Đây là một số mã mà tôi muốn sử dụng với mục đích lấy khoảng thời gian giữa hai ngày. Nó chấp nhận hai ngày và cung cấp cho bạn một câu trả lời có cấu trúc câu hay.

Đây là phiên bản sửa đổi một chút của mã được tìm thấy ở đây .

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

Nguồn: https://gist.github.com/ozh/8169202


0

Tất cả trong một giải pháp. Không cung cấp đơn vị nào có số 0. Sẽ chỉ tạo ra số lượng đơn vị bạn chỉ định (3 theo mặc định). Khá dài, có lẽ không được thanh lịch cho lắm. Định nghĩa là tùy chọn, nhưng có thể hữu ích trong một dự án lớn.

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

Vui lòng bỏ phiếu xuống, nhưng hãy nhớ thử nó trong mã của bạn. Nó chỉ có thể là những gì bạn cần.


0

Giải pháp cho giải pháp này mà tôi đã sử dụng (trước đây khi học PHP) mà không có bất kỳ chức năng nào:

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

Mặc dù đây là một câu hỏi cũ, nhưng những người mới học qua câu hỏi này có thể thấy câu trả lời này hữu ích.


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)

0

Tôi không biết tại sao một số câu trả lời trong số này lại dài hoặc phức tạp một cách kỳ cục. Đây là một trong những sử dụng Lớp DateTime . Kiểu tương tự như câu trả lời của radzserg. Điều này sẽ chỉ hiển thị các đơn vị cần thiết và thời gian âm sẽ có hậu tố 'trước' ...

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

CHỈNH SỬA: Nếu bạn muốn cô đọng ví dụ trên để sử dụng ít biến / không gian hơn (với chi phí dễ đọc), đây là một phiên bản thay thế thực hiện điều tương tự:

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 $thetime ? implode(' ', $thetime) . ($interval->invert ? ' ago' : '') : NULL;
}

Bạn có thể muốn thêm an toàn vào chức năng calctime để bảo vệ khỏi 0 giây. Mã hiện tại gây ra lỗi. Tóm $thetimelại, ví dụ:isset($thetime)
Stargazing Worm

0

Tôi đang chỉnh sửa một trong những mã để nó hoạt động tốt khi giá trị âm xuất hiện. floor()hàm không đưa ra số đếm chính xác khi giá trị âm. Vì vậy chúng ta cần sử dụng abs()function trước khi sử dụng nó trong floor()function. $inputSecondsbiến có thể là sự khác biệt giữa dấu thời gian hiện tại và ngày được yêu cầu.

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

0

Một biến thể cho câu trả lời của @ Glavić - biến thể này ẩn các số 0 ở đầu để có kết quả ngắn hơn và sử dụng số nhiều ở những vị trí chính xác. Nó cũng loại bỏ độ chính xác không cần thiết (ví dụ: nếu thời gian chênh lệch hơn 2 giờ, bạn có thể không quan tâm bao nhiêu phút hoặc giây).

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

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

Giá trị $ đến từ Cơ sở dữ liệu. Mã này nằm trong Codeigniter. $ SESSION được sử dụng để lưu trữ đăng ký của người dùng. nó là bắt buộc. Tôi đã sử dụng nó trong trường hợp của tôi, bạn có thể sử dụng bất cứ điều gì bạn muốn.


1
Bạn có thể thêm một số giải thích cho mã của bạn? Từ đâu $valueđến? Tại sao bạn meed để giới thiệu một phiên? Làm cách nào để trả về chuỗi thích hợp cho giây, phút và giờ?
Nico Haase

Câu trả lời @NicoHaase Đã cập nhật.
Tayyab Hayat

-2

Đây là một chức năng tôi đã sử dụng trước đây để trừ một ngày từ một ngày khác có liên quan đến câu hỏi của bạn.

$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";
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.