Выход из-под контроля

Я проголосовал за 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 или просто отфильтровать их при выводе строки.

0
задан Aly And-Jesse Moon 23 March 2019 в 17:45
поделиться