Как лучше всего рассчитать общее количество секунд между двумя датами? До сих пор я пробовал что-то вроде:
$delta = $date->diff(new DateTime('now'));
$seconds = $delta->days * 60 * 60 * 24;
Однако days
в текущей сборке PHP5.3 свойство объекта DateInterval кажется нарушенным (по крайней мере, в Windows оно всегда возвращает одно и то же 6015
значение). Я также попытался сделать это таким образом, чтобы не сохранять количество дней в каждом месяце (округление до 30), високосные годы и т. Д .:
$seconds = ($delta->s)
+ ($delta->i * 60)
+ ($delta->h * 60 * 60)
+ ($delta->d * 60 * 60 * 24)
+ ($delta->m * 60 * 60 * 24 * 30)
+ ($delta->y * 60 * 60 * 24 * 365);
Но я действительно не доволен использованием этого неполноценного решения.
$delta->format("%r%s")
?format
том, что когда говорят, что количество секунд равно 0, а количество минут равно 1,$delta->format("%r%s")
оказывается 0 :(Ответы:
Не могли бы вы вместо этого сравнить отметки времени ?
$now = new DateTime('now'); $diff = $date->getTimestamp() - $now->getTimestamp()
источник
getTimestamp()
метод доступен в PHP> = 5.3.0.format('U')
вместоgetTimestamp()
.Эта функция позволяет получить общую продолжительность в секундах из объекта DateInterval.
/** * @param DateInterval $dateInterval * @return int seconds */ function dateIntervalToSeconds($dateInterval) { $reference = new DateTimeImmutable; $endTime = $reference->add($dateInterval); return $endTime->getTimestamp() - $reference->getTimestamp(); }
источник
$endTime
и$reference
друг на друга, поскольку это дает мне отрицательный результат с будущим значением интервала datetime.Сделать это можно так:
$currentTime = time(); $timeInPast = strtotime("2009-01-01 00:00:00"); $differenceInSeconds = $currentTime - $timeInPast;
time () возвращает текущее время в секундах с момента времени эпохи (1970-01-01T00: 00: 00), а strtotime делает то же самое, но в зависимости от указанной вами даты / времени.
источник
static function getIntervalUnits($interval, $unit) { // Day $total = $interval->format('%a'); if ($unit == TimeZoneCalc::Days) return $total; //hour $total = ($total * 24) + ($interval->h ); if ($unit == TimeZoneCalc::Hours) return $total; //min $total = ($total * 60) + ($interval->i ); if ($unit == TimeZoneCalc::Minutes) return $total; //sec $total = ($total * 60) + ($interval->s ); if ($unit == TimeZoneCalc::Seconds) return $total; return false; }
источник
Всегда приятно, когда то, что тебе нужно, уже присутствует в виде класса. В вашем случае вам нужно общее количество секунд. Почему бы не сделать из этого класс? Код мог выглядеть так:
(new TotalFullSeconds( new IntervalFromRange( new DateTimeFromISO8601String('2017-07-03T14:27:39+00:00'), new DateTimeFromISO8601String('2017-07-05T14:27:39+00:00') ) )) ->value()
Помимо интуитивности, вы также можете воспользоваться функцией автозаполнения в своей среде IDE.
Для более полезной реализации вы можете проверить эту библиотеку .
источник
Вы можете просто ввести точные числа (вместо 60 * 60 - введите 3600), чтобы не приходилось вычислять их каждый раз.
Изменить - исправлено число на основе вашего комментария.
источник