例如,如果我有:
$seconds = 3744000; // i want to output: 43 days, 8 hours, 0 minutes
我是否必须创建一个转换此功能的函数?或者PHP已经内置了一些内容来实现date()
?
答案 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)
现在实现这一目标的一种简单方法是使用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秒
答案 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;
}