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

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

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

Ответы

Ответ 1

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

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

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

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

Здесь

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

Ответ 2

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

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

Этот метод будет обрабатывать интервалы, созданные с помощью конструктора DateInterval более или менее правильно, тогда как shiplu answer будет игнорировать годы, месяцы и дни для таких интервалов. Однако ответ shiplu более точен для интервалов, которые были созданы путем вычитания двух дат. Для интервалов, состоящих только из часов, минут и секунд, оба метода получат правильный ответ.

Ответ 3

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

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

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

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

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

new DateInterval('P4M3DT2H'); 

Он отлично справляется с месяцами.