例如,如果我有:
$seconds = 3744000; // i want to output: 43 days, 8 hours, 0 minutes
我必须创建一个函数来转换它吗?或者 PHP 是否已经内置了一些东西来做到这一点date()
?
例如,如果我有:
$seconds = 3744000; // i want to output: 43 days, 8 hours, 0 minutes
我必须创建一个函数来转换它吗?或者 PHP 是否已经内置了一些东西来做到这一点date()
?
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);
这很简单,很容易在核心 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";
现在实现这一点的一种简单方法是使用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
的构造函数中指定.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 秒
我最喜欢 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;
}