Intereting Posts
PHP: DOMDocument – атрибуты с двоеточием в нем? Советы по разработке приложений Laravel PHP, новый класс переменных в пространстве имен mod_rewrite – я не могу заставить его работать, как я хочу Лучший способ избежать инъекции кода в PHP 302 найденный документ перемещен с помощью CodeIgniter Как очистить веб-сайты, когда cURL и allow_url_fopen отключены PHP SoapClient, создающий XML-ссылки для идентичных элементов, делает его неприемлемым для обслуживания Вставка списка значений не соответствует списку столбцов: 1136 Число столбцов не соответствует количеству значений если утверждения в php-шаблонах с использованием tpl Получить URL-адрес из URL-адреса страницы Как правильно обрабатывать запросы разбиения на страницы с помощью mongodb и php? Программно найти файл журнала ошибок PHP Можно ли MySQL легко заменить на MariaDB или есть ли что-то изменить в этом случае? resize () не работает, используя класс манипуляции с изображениями

Вычислить общее количество секунд в PHP DateInterval

Каков наилучший способ рассчитать общее количество секунд между двумя датами? До сих пор я пробовал что-то вроде:

$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), поэтому каждый раз их не нужно вычислять.

Изменить – исправлено число, основанное на комментариях.