修改Datetime函数以显示正确的间隔


Modify Datetime function to show right interval

我检查过了,这不是重复的。我有这个功能

$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