Преобразование объекта DateInterval в секунды в php

$datetime1 = date_create('2009-10-11');
$datetime2 = date_create('2009-10-13');
$interval = date_diff($datetime1, $datetime2);

Как преобразовать выше $interval до секунд в php

3 ответов


есть функция format для этого. Но это не вернет количество секунд. Чтобы получить количество секунд, вы используете эту технику

$seconds = abs($datetime1->getTimestamp()-$datetime2->getTimestamp());

если вы действительно хотите использовать $interval вам нужно рассчитать его.

$seconds = $interval->days*86400 + $interval->h*3600 
           + $interval->i*60 + $interval->s;

здесь

  • 86400 это количество секунд в день
  • 3600 это количество секунд в час
  • 60 это количество секунд в минуту

другой способ получить количество секунд в интервале-добавить его к нулевой дате и получить метку времени этой даты:

$seconds = date_create('@0')->add($interval)->getTimestamp();

этот метод будет обрабатывать интервалы, созданные с помощью dateinterval contructor более или менее правильно, тогда как shiplu это!--5--> будет игнорировать годы, месяцы и дни для таких интервалов. Однако ответ шиплу более точен для интервалов, которые были созданы путем вычитания двух дат. Для интервалов, состоящих только из часов, минуты и секунды, оба метода получат правильный ответ.


Я бы только добавил к shiplu это:

function dateIntervalToSeconds($interval)
{
    $seconds = $interval->days*86400 + $interval->h*3600 
       + $interval->i*60 + $interval->s;
    return $interval->invert == 1 ? $seconds*(-1) : $seconds;
}

для обработки отрицательных интервалов.

обратите внимание, что, вопреки ответ Brilliand - код выше будет правильно учитывать годы, месяцы и даты. Поскольку $interval - >days является абсолютным значением ($interval->d относительно месяца).

EDIT: эта функция все равно не правильно, как указал @Brilliand. Контр-пример

new DateInterval('P4M3DT2H'); 

он не справляется с месяцами хорошо.