4

例如,如果我有:

$seconds = 3744000; // i want to output: 43 days, 8 hours, 0 minutes

我必须创建一个函数来转换它吗?或者 PHP 是否已经内置了一些东西来做到这一点date()

4

4 回答 4

22
function secondsToWords($seconds)
{
    $ret = "";

    /*** get the days ***/
    $days = intval(intval($seconds) / (3600*24));
    if($days> 0)
    {
        $ret .= "$days days ";
    }

    /*** get the hours ***/
    $hours = (intval($seconds) / 3600) % 24;
    if($hours > 0)
    {
        $ret .= "$hours hours ";
    }

    /*** get the minutes ***/
    $minutes = (intval($seconds) / 60) % 60;
    if($minutes > 0)
    {
        $ret .= "$minutes minutes ";
    }

    /*** get the seconds ***/
    $seconds = intval($seconds) % 60;
    if ($seconds > 0) {
        $ret .= "$seconds seconds";
    }

    return $ret;
}

print secondsToWords(3744000);
于 2012-05-19T19:51:46.817 回答
2

这很简单,很容易在核心 php 中找到天、小时、分钟和秒:

$dbDate = strtotime("".$yourdbtime."");
$endDate = time();
$diff = $endDate - $dbDate;
$days = floor($diff/86400);
$hours = floor(($diff-$days*86400)/(60 * 60));
$min = floor(($diff-($days*86400+$hours*3600))/60);
$second = $diff - ($days*86400+$hours*3600+$min*60);

 if($days > 0) echo $days." Days ago";
 elseif($hours > 0) echo $hours." Hours ago";
 elseif($min > 0) echo $min." Minutes ago";
 else echo "Just now";
于 2013-09-25T07:29:59.017 回答
2

现在实现这一点的一种简单方法是使用DateTimeImmutable,DateInterval和 PHP 5.5.0 或更高版本:

$seconds = 3744000;

$interval = new DateInterval("PT{$seconds}S");
$now = new DateTimeImmutable('now', new DateTimeZone('utc'));

$difference = $now->diff($now->add($interval))->format('%a days, %h hours, %i minutes');

结果将是:

43 天 8 小时 0 分钟

该代码将秒数添加到日期并计算差异。像这样,秒转换为指定的天、小时和分钟。


警告 1:在没有 UTC 的情况下工作 - 时钟更改

可能不会在对象DateTimeZone的构造函数中指定.DateTimeImmutableUTC

$now = new DateTimeImmutable();

这个世界上有些地区的时钟在一年中的特定日子发生变化。例如,欧盟的大多数国家/地区在夏季和冬季之间转换。

如果您的日期间隔与发生时钟更改的那一天重叠,并且您的服务器设置为该时钟更改的相关区域,则结果也可能会更改。最好用下面的例子来说明这一点:

$twentyFourHours = new DateInterval('PT24H');
$twentyFiveHours = new DateInterval('PT25H');

//Pacific time changed from summer- to winter-time on that day
$summerToWinter = new DateTimeImmutable('2018-11-04');

如果将$summerToWinter日期加上 24 小时,您将得到以下结果:

$extra24Hours = $summerToWinter->add($twentyFourHours);
echo $summerToWinter->format('y-m-d H:i');
echo $extra24Hours->format('y-m-d H:i');
echo $summerToWinter->diff($extra24Hours)->format('%a days, %h hours, %i minutes');

18-11-04 00:00

18-11-04 23:00

0 天 24 小时 0 分钟

如您所见,当天的 00:00 和 23:00 之间是 24 小时,这在技术上是正确的。由于时钟更改,当天 02:00 和 03:00 之间的时间间隔发生了两次。

添加 25 小时将导致:

$extra25Hours = $summerToWinter->add($twentyFiveHours);
echo $summerToWinter->format('y-m-d H:i');
echo $extra25Hours->format('y-m-d H:i');
echo $summerToWinter->diff($extra25Hours)->format('%a days, %h hours, %i minutes');

18-11-04 00:00

18-11-05 00:00

1 天 0 小时 0 分钟

正如我们所见,1 天过去了,25 小时过去了。如果这适用于3744000原始问题的秒数,结果将显示:

43 天 7 小时 0 分钟

但是,没有显示过去一天有 25 小时的信息。

此外,对于将时钟从冬季时间更改为夏季时间的一天,我无法重现相同的效果,这应该只经过 23 小时。


警告 2:使用原始 DateInterval 对象

不使用此代码DateTimeImmutable将导致错误的输出:

$seconds = 3744000;
$interval = new DateInterval("PT{$seconds}S");
$difference = $interval->format('%a days, %h hours, %i minutes, %s seconds');

现在,对象中只设置了秒数DateInterval$difference将会:

(未知)天,0 小时,0 分钟,3744000 秒

于 2018-04-20T10:06:45.900 回答
1

我最喜欢 Ian Gregory 的回答并对其表示赞同,但我认为我会稍微简化一下:

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

    $days = $days ? $days . ' days' : '';
    $hours = $hours ? $hours . ' hours' : '';
    $minutes = $minutes ? $minutes . ' minutes' : '';
    $seconds = $seconds ? $seconds . ' seconds' : '';

    return $days . $hours . $minutes . $seconds;
}
于 2018-04-20T09:45:40.437 回答