Я проголосовал за jurka answer , так как это мой любимый, но у меня есть версия pre-php.5.3 ...
I обнаружил, что я работаю над подобной проблемой - именно так я столкнулся с этим вопросом в первую очередь, но просто нуждался в разнице в часах. Но моя функция также решила эту проблему очень хорошо, и у меня нет нигде в моей собственной библиотеке, чтобы она не терялась и не забывалась, поэтому ... надеюсь, что это кому-то полезно.
/**
*
* @param DateTime $oDate1
* @param DateTime $oDate2
* @return array
*/
function date_diff_array(DateTime $oDate1, DateTime $oDate2) {
$aIntervals = array(
'year' => 0,
'month' => 0,
'week' => 0,
'day' => 0,
'hour' => 0,
'minute' => 0,
'second' => 0,
);
foreach($aIntervals as $sInterval => &$iInterval) {
while($oDate1 <= $oDate2){
$oDate1->modify('+1 ' . $sInterval);
if ($oDate1 > $oDate2) {
$oDate1->modify('-1 ' . $sInterval);
break;
} else {
$iInterval++;
}
}
}
return $aIntervals;
}
И тест:
$oDate = new DateTime();
$oDate->modify('+111402189 seconds');
var_dump($oDate);
var_dump(date_diff_array(new DateTime(), $oDate));
И результат:
object(DateTime)[2]
public 'date' => string '2014-04-29 18:52:51' (length=19)
public 'timezone_type' => int 3
public 'timezone' => string 'America/New_York' (length=16)
array
'year' => int 3
'month' => int 6
'week' => int 1
'day' => int 4
'hour' => int 9
'minute' => int 3
'second' => int 8
Я получил оригинальную идею из здесь , что я измененный для моих целей (и я надеюсь, что мои изменения также покажутся на этой странице).
Вы можете легко удалить интервалы, которые вы не хотите (скажем, «неделя»), удалив их из $aIntervals
, или, возможно, добавить параметр $aExclude
или просто отфильтровать их при выводе строки.