将秒转换为天、小时、分钟和秒


Convert seconds into days, hours, minutes and seconds

我想将秒的变量$uptime转换为天、小时、分钟和秒。

例:

$uptime = 1640467;

结果应为:

18 days 23 hours 41 minutes

这可以通过DateTime类来实现

功能:

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

用:

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

演示

这是

重写为包含天数的函数。 我还更改了变量名称以使代码更易于理解......

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

来源: CodeAid(( - http://codeaid.net/php/convert-秒-小时-分钟-秒-(php(

基于 Julian Moreno 的回答,但更改为以字符串(而不是数组(的形式给出响应,仅包含所需的时间间隔,而不假设复数形式。

这与投票最高的答案之间的区别是:

259264 秒内,此代码将给出

3 天 1 分 4 秒

259264秒内,投票最高的答案(由格拉维奇(会给出

3 天 0 小时 1 分4

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

我希望这对某人有所帮助。

这是一个简单的 8 行 PHP 函数,可将秒数转换为人类可读的字符串,包括大量秒数的月数:

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";
}
gmdate("d H:i:s",1640467);

结果将是 19 23:41:07。即使时间多了 1 秒,也会导致日期发生变化。所以结果是 19。您可以根据需要分解结果并解决此问题。

这里有一些非常好的答案,但没有一个能满足我的需求。我以格拉维奇的答案为基础,添加了一些我需要的额外功能;

  • 不要打印零。所以"5 分钟"而不是"0 小时 5 分钟">
  • 正确处理复数形式
  • ,而不是默认为复数形式。
  • 将输出限制为设定的单位数;所以"2个月2天"而不是"2个月2天1小时45分钟">

您可以在此处查看代码的运行版本。

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

简短、简单、可靠:

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

Laravel示例

700+ 由 Carbon 支持的语言环境

'Carbon'CarbonInterval::seconds(1640467)->cascade()->forHumans(); //2 weeks 4 days 23 hours 41 minutes 7 seconds
最简单的

方法是创建一个方法,该方法从 DateTime::d iff 返回 DateInterval,该方法从当前时间$now返回相对时间$seconds的相对时间,然后您可以链接和格式化该方法。例如:-

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

现在将方法调用链接到日期间隔::格式

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

结果:

18 days 23 hours 41 minutes
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);

虽然这是一个相当古老的问题 - 人们可能会发现这些有用(不是为了快速编写(:

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

结果:

0d21h57m13s
21h57m13s
9d21h57m13s
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);
}

应排除 0 个值并设置正确的单数/复数值的解决方案

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的答案。这将仅显示必要的单位,负时间将具有"ago"后缀...

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

编辑:如果您想压缩上述示例以使用更少的变量/空间(以牺牲易读性为代价(,这里有一个替代版本可以做同样的事情:

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

Glavić优秀解决方案的扩展版本,具有整数验证,解决1 s问题,以及对数年和数月的额外支持,代价是计算机解析不那么友好,而对人类更友好:

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

function secondsToTime($seconds) {
    $time = [];
    $minutes = $seconds / 60;
    $seconds = $seconds % 60;
    $hours = $minutes / 60;
    $minutes = $minutes % 60;
    $days = $hours / 24;
    $hours = $hours % 24;
    $month = $days /30;
    $days = $days % 30;
    $year = $month / 12;
    $month = $month % 12;
    if ((int)($year) != 0){
        array_push($time,[ "year" => (int)($year)]);
    }
    if ($month != 0){
        array_push($time, ["months" => $month]);
    }
    if ($days != 0){
        array_push($time,["days" => $days]);
    }
    if ($hours != 0){
        array_push($time,["hours" => $hours]);
    }
    if ($minutes != 0){
        array_push($time,["minutes" => $minutes]);
    }
    if ($seconds != 0){
        array_push($time,["seconds" => $seconds]);
    }
    return $time;
}

我认为Carbon会给你你想要的所有多样性

因此,对于您的示例,您将添加此代码

$seconds = 1640467;
$time = Carbon::now();
$humanTime = $time->diffForHumans($time->copy()->addSeconds($seconds), true, false, 4);

输出将是这样的

2 周 4 天 23 小时 41 分钟

可以使用我编写的间隔类。它也可以以相反的方式使用。

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

更多信息在这里 https://github.com/LubosRemplik/CakePHP-Interval

with 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

更详细一点,跳过零的时间单位

function secondsToTime($ss) 
{
    $htmlOut="";
    $s = $ss%60;
    $m = floor(($ss%3600)/60);
    $h = floor(($ss%86400)/3600);
    $d = floor(($ss%2592000)/86400);
    $M = floor($ss/2592000);
    if ( $M > 0 )
    {
        $htmlOut.="$M months";      
    }
    if ( $d > 0 )
    {
        if ( $M > 0 )
         $htmlOut.=", ";
        $htmlOut.="$d days";        
    }
    if ( $h > 0 )
    {
        if ( $d > 0 )
         $htmlOut.=", ";
        $htmlOut.="$h hours";       
    }
    if ( $m > 0 )
    {
        if ( $h > 0 )
         $htmlOut.=", ";            
        $htmlOut.="$m minutes";     
    }
    if ( $s > 0 )
    {
        if ( $m > 0 )
         $htmlOut.=" and ";         
        $htmlOut.="$s seconds";     
    }       
    return $htmlOut;
}   

多合一解决方案。不给出带零的单位。将仅生成您指定的单位数(默认为 3(。相当长,也许不是很优雅。定义是可选的,但在大型项目中可能会派上用场。

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

这里有一些我喜欢用来获取两个日期之间的持续时间的代码。它接受两个日期,并给你一个很好的句子结构回复。

这是此处代码的略微修改版本。

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

来源:https://gist.github.com/ozh/8169202

我使用的解决方案(回到学习 PHP 时的日子(,没有任何函数:

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

虽然这是一个老问题,但遇到这个问题的新学习者可能会发现这个答案很有用。

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)

我正在编辑其中一段代码,以便在负值出现时很好地工作。 当值为负时,floor()函数不会给出正确的计数。因此,我们需要先使用abs()函数,然后再在floor()函数中使用它。 $inputSeconds变量可以是当前时间戳与所需日期之间的差异。

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

@Glavić答案的变体 - 这个隐藏了前导零以获得更短的结果,并在正确的位置使用复数。它还消除了不必要的精度(例如,如果时差超过 2 小时,您可能不在乎多少分钟或多少秒(。

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

添加了一些格式,修改自格拉维奇对 Facebook 风格帖子计数时间的出色回答......

        function secondsToTime($seconds) {
    $dtF = new 'DateTime('@0');
    $dtT = new 'DateTime("@$seconds");
    switch($seconds){
        case ($seconds<60*60*24): // if time is less than one day
        return $dtF->diff($dtT)->format('%h hours, %i minutes, %s seconds');
        break;
        case ($seconds<60*60*24*31 && $seconds>60*60*24): // if time is between 1 day and 1 month
        return $dtF->diff($dtT)->format('%d days, %h hours');
        break;
        case ($seconds<60*60*24*365 && $seconds>60*60*24*31): // if time between 1 month and 1 year
        return $dtF->diff($dtT)->format('%m months, %d days');
        break;
        case ($seconds>60*60*24*365): // if time is longer than 1 year
        return $dtF->diff($dtT)->format('%y years, %m months');
        break;

    }
function secondsToHumanTime(int $seconds, array $filter = []): string
{
    $intervalDefinitions = [
       'year'   => ['interval' => 31536000, 'labels' => ['year', 'years']],
       'month'  => ['interval' => 2592000, 'labels' => ['month', 'months']],
       'week'   => ['interval' => 604800, 'labels' => ['week', 'weeks']],
       'day'    => ['interval' => 86400, 'labels' => ['day', 'days']],
       'hour'   => ['interval' => 3600, 'labels' => ['hour', 'hours']],
       'minute' => ['interval' => 60, 'labels' => ['minute','minutes']],
       'second' => ['interval' => 1, 'labels' => ['second','seconds']],
    ];
    $filteredIntervalDefinitions = array_column(
        $filter ?
            array_intersect_key($intervalDefinitions, array_flip($filter)) :
            $intervalDefinitions,
        'labels',
        'interval'
    );
    $intervals = [];
    foreach ($filteredIntervalDefinitions as $numerator => $labels) {
        if($counter = intdiv($seconds, $numerator)) {
            $intervals[] = $counter . ' ' . ($labels[(int)((bool)($counter - 1))] ?? '');
            $seconds -= ($counter * $numerator);
        }
    }
    return implode(' ', $intervals);
}

例子:

echo secondsToHumanTime(0) ."'n";
echo secondsToHumanTime(10) ."'n";
echo secondsToHumanTime(100)."'n";
echo secondsToHumanTime(1000)."'n";
echo secondsToHumanTime(10000)."'n";
echo secondsToHumanTime(100000)."'n";
echo secondsToHumanTime(1000000)."'n";
echo secondsToHumanTime(10000000)."'n";
echo secondsToHumanTime(100000000)."'n";
echo secondsToHumanTime(1000000000)."'n";
echo secondsToHumanTime(10000000000)."'n";
echo secondsToHumanTime(100000000000)."'n";

结果:

10 秒1 分 40 秒
16 分 40 秒
2 小时 46 分 40 秒
1 天 3 小时 46 分 40 秒
1 周 4 天 13 小时 46 分 40 秒
3 个月 3 周 4 天 17 小时 46 分 40 秒
3 年 2 个月 2 天 9 小时 46 分 40 秒
31 年 8 个月 2 周 5 天 1 小时 46 分 40 秒
317 年 1 个月 5 天 17 小时 46 分 40 秒
3170 年 11 个月 3 周 6 天 9 小时 46 分 40 秒

过滤器示例:

echo secondsToHumanTime(100000000)."'n";
//only years and months
echo secondsToHumanTime(100000000, ['year', 'month'])."'n";
//only years and days
echo secondsToHumanTime(100000000, ['year','day'])."'n";
//...
echo secondsToHumanTime(100000000 - 39, ['year', 'minute', 'second'])."'n";

结果:

3 年 2 个月 2 天 9 小时 46 分 40 秒
3 年 2 个月3 岁 62 天3 年 89866 分钟 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来自数据库。此代码位于 Codeigniter 中。$SESSION用于存储用户订阅。这是强制性的。我在我的情况下使用了它,你可以使用任何你想要的东西。

这是我

过去用来从与您的问题相关的另一个日期中减去日期的函数,我的原则是获取产品过期前还剩多少天、小时分钟和秒:

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