Каков наилучший способ рассчитать общее количество секунд между двумя датами? До сих пор я пробовал что-то вроде:
$delta = $date->diff(new DateTime('now')); $seconds = $delta->days * 60 * 60 * 24;
Однако свойство days объекта DateInterval кажется сломанным в текущей сборке PHP5.3 (по крайней мере, в 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);
Но я действительно недоволен использованием этого полуподобного решения.
Не могли бы вы вместо этого сравнить метки времени ?
$now = new DateTime('now'); $diff = $date->getTimestamp() - $now->getTimestamp()
Эта функция позволяет вам получить общую продолжительность в секундах от объекта DateInterval
/** * @param DateInterval $dateInterval * @return int seconds */ function dateIntervalToSeconds($dateInterval) { $reference = new DateTimeImmutable; $endTime = $reference->add($dateInterval); return $endTime->getTimestamp() - $reference->getTimestamp(); }
Вы можете сделать это так:
$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; }
Вы можете просто положить жесткие цифры (вместо 60 * 60 – положить в 3600), поэтому каждый раз их не нужно вычислять.
Изменить – исправлено число, основанное на комментариях.