50

Вопрос по php, datetime – Получить интервал секунд между двумя datetime в PHP?

2009-10-05 18:11:08

2009-10-05 18:07:13

Это должно генерировать 235, как это сделать?

<span>Возможный дубликат<a href="http://stackoverflow.com/questions/3176609/calculate-total-seconds-in-php-dateinterval">Рассчитать общее количество секунд в PHP DateInterval</a></span>

Feb 18, 2016, 12:55 AMотFactoryAidan

7ответов

138

С объектами DateTime вы можете сделать это следующим образом:

$date = new DateTime( '2009-10-05 18:07:13' );
$date2 = new DateTime( '2009-10-05 18:11:08' );

$diffInSeconds = $date2->getTimestamp() - $date->getTimestamp();
4

Из-за ограничений эпохи Unix у вас могут возникнуть проблемы с сопоставлением дат до 1970 г. и после 2038 г. Я предпочитаю потерять точность (= don 'не обращайте внимания на одну секунду), но избегайте проходных преобразований эпохи Unix (getTimestamp). Это зависит от того, что вы делаете, чтобы сделать ...

В моем случае вместо 365 (12 * 30) и "30" как средняя длина месяца, уменьшена ошибка в полезном выводе.

function DateIntervalToSec($start,$end){ // as datetime object returns difference in seconds
    $diff = $end->diff($start);
    $diff_sec = $diff->format('%r').( // prepend the sign - if negative, change it to R if you want the +, too
                ($diff->s)+ // seconds (no errors)
                (60*($diff->i))+ // minutes (no errors)
                (60*60*($diff->h))+ // hours (no errors)
                (24*60*60*($diff->d))+ // days (no errors)
                (30*24*60*60*($diff->m))+ // months (???)
                (365*24*60*60*($diff->y)) // years (???)
                );
    return $diff_sec;
}

Обратите внимание, что ошибка может быть 0, если "имею в виду" величины предназначены для сравнения PHP документы неТ говорит об этом ... В плохом случае ошибка может быть:

  • 0 секунд, если diff применяется к временным промежуткам < 1 месяц
  • От 0 до 3 дней, если разница применяется к временным промежуткам> 1 месяц
  • От 0 до 14 дней, если разница применяется к временным промежуткам> 1 год

Я предпочитаю предположить, что кто-то решил считать "м" как 30 дней и "у" как 365, зарядка "д" с той разницей, когда "Diff» пройти через месяцы без 30 дней ...

Если кто-то знает об этом больше и может предоставить официальную документацию, добро пожаловать!

2

strtotime("2009-10-05 18:11:08") - strtotime("2009-10-05 18:07:13")
2

Если вам нужна реальная местная разница во времени и вы хотите работать сgetTimestampнеобходимо учитывать DST-переключатели в течение расчетного периода. Следовательно, местное смещение к UTC должно быть включено в уравнение.

Возьмите, например, следующие даты:

$tz = new \DateTimeZone("Europe/Berlin");
$start = new \DateTime("2018-02-01 12:00:00", $tz);
$end = new \DateTime("2018-04-01 12:00:00", $tz);

$start является "2018-02-01 11:00:00 в UTC, пока$end является "2018-04-01 10:00:00 в UTC. Обратите внимание, что, хотя время суток одинаково в часовом поясе Берлина, оно отличается в UTC. Смещение UTC составляет один час$start и 2 часа$end

Имейте в виду, чтоgetTimestamp всегда возвращает UTC! Поэтому вы должны вычесть смещение из отметки времени при поиске фактической локальной разницы.

// WRONG! returns 5094000, one hour too much due to DST in the local TZ
echo $end->getTimestamp() - $start->getTimestamp();

// CORRECT: returns 5090400
echo ($end->getTimestamp() - $end->getOffset()) - ($start->getTimestamp() - $start->getOffset());
8

PHP Date Time Reference полезен для таких вещей:PHP Дата Время Функции

StrToTime () это, наверное, лучший способ.

$seconds = strtotime('2009-10-05 18:11:08') - strtotime('2009-10-05 18:07:13')
70

Ты можешь использоватьStrToTime () сделать это:

$diff = strtotime('2009-10-05 18:11:08') - strtotime('2009-10-05 18:07:13')

Подобный подход возможен с объектами DateTime, например,

$date = new DateTime( '2009-10-05 18:07:13' );
$date2 = new DateTime( '2009-10-05 18:11:08' );

$diff = $date2->getTimestamp() - $date->getTimestamp();
-1

Простое и точное решение (на примере Nilz11 'комментарий):

$hiDate = new DateTime("2310-05-22 08:33:26");
$loDate = new DateTime("1910-11-03 13:00:01");
$diff = $hiDate->diff($loDate);
$secs = ((($diff->format("%a") * 24) + $diff->format("%H")) * 60 + 
   $diff->format("%i")) * 60 + $diff->format("%s");

RelatedQuestions