Преобразование объекта 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');
он не справляется с месяцами хорошо.