我检查过了,这不是重复的。我有这个功能
$since = date('Y-m-d H:i:s', strtotime($since));
$date = new DateTime($since);
$interval = $date->diff(new DateTime('now'));
return $interval->format('%y years, %m months, %d days, %h hours and %i minutos ago %s seconds ago');
但当然,我会得到一个类似"5年2个月5天……"的约会
我想要的只是中场休息的一部分。意思是,我不想得到"0年,0个月,0天",但让我们说"3分钟"或"5天"等…
我是DateTime的新手,但在php.net网站上没有找到这样的函数。有没有,或者我必须自己创造一个?谢谢
这就是我想到的:
<?php
/**
* Return formatted interval where only the largest unit gets displayes.
* @param DateInterval $interval
*
* @return string
*/
function format_properly(DateInterval $interval) {
if ($interval->y !== 0) {
return $interval->format("%y years");
}
if ($interval->m !== 0) {
return $interval->format("%m months");
}
if ($interval->d !== 0) {
return $interval->format("%d days");
}
if ($interval->h !== 0) {
return $interval->format("%h hours");
}
if ($interval->i !== 0) {
return $interval->format("%i minutes");
}
if ($interval->s !== 0) {
return $interval->format("%s seconds");
}
return "0 seconds";
}
$date = new DateTime("now");
$date->sub(new DateInterval("PT2H5M")); //Now - 2 hours and 5 minutes
$now = new DateTime("now");
$interval = $date->diff($now);
echo format_properly($interval);
var_dump($interval);
DateTime::diff
返回一个DateInterval
实例,其字段包括:
public integer $y ;
public integer $m ;
public integer $d ;
public integer $h ;
public integer $i ;
public integer $s ;
只需选择您需要的,例如$interval -> h
。
编辑这里你有一个包装:
function formatInterval(DateInterval $interval)
{
static $values = array(
'y' => 'years',
'm' => 'months',
'd' => 'days',
'h' => 'hours',
'i' => 'minutes',
's' => 'seconds',
);
$formatString = "";
foreach($values as $key => $label)
{
if(($value = $interval -> {$key}) === 0)
continue;
$formatString .= sprintf('%s %s ', $value, $label);
}
return $formatString;
}
$date = new DateTime;
$interval = $date -> diff( new DateTime('2012-09-7'));
echo formatInterval($interval);
打印输出:
20 hours 47 minutes 13 seconds