PHP中是否内置了将秒数转换为天,小时,分钟的内容?

时间:2012-05-19 19:46:43

标签: php

例如,如果我有:

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

我是否必须创建一个转换此功能的函数?或者PHP已经内置了一些内容来实现date()

4 个答案:

答案 0 :(得分:18)

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

答案 1 :(得分: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";

答案 2 :(得分:2)

现在实现这一目标的一种简单方法是使用DateTimeImmutableDateInterval和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对象的构造函数中的DateTimeImmutable指定为UTC

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

答案 3 :(得分:0)

我最喜欢伊恩格雷戈里的回答而且赞成它,但我认为我只是简化了一点:

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