Получить интервал секунд между двумя datetime в PHP? - PullRequest
56 голосов
/ 05 октября 2009

2009-10-05 18: 11: 08

2009-10-05 18: 07: 13

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

Ответы [ 7 ]

142 голосов
/ 14 июня 2013

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

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

$diffInSeconds = $date2->getTimestamp() - $date->getTimestamp();
76 голосов
/ 05 октября 2009

Вы можете использовать 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();
8 голосов
/ 05 октября 2009

Справочник по дате PHP полезен для таких вещей: Функции даты и времени PHP

strtotime () , вероятно, лучший способ.

$seconds = strtotime('2009-10-05 18:11:08') - strtotime('2009-10-05 18:07:13')
4 голосов
/ 13 марта 2014

Из-за ограничений эпохи Unix у вас могут возникнуть проблемы с сопоставлением дат до 1970 г. и после 2038 г. Я предпочитаю потерять точность (= не смотреть на одну секунду), но избегать проходить через преобразования эпохи 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 месяц </li>
  • от 0 до 3 дней, если разница применяется к временным промежуткам> 1 месяц
  • от 0 до 14 дней, если разница применяется к временным промежуткам> 1 года

Я предпочитаю предположить, что кто-то решил считать «m» как 30 дней, а «y» - как 365, начисляя «d» с той разницей, когда «diff» проходит через не 30-дневные месяцы ...

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

2 голосов
/ 19 июля 2018

Если вам нужна реальная разница местного времени и вы хотите работать с 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());
2 голосов
/ 05 октября 2009
strtotime("2009-10-05 18:11:08") - strtotime("2009-10-05 18:07:13")
0 голосов
/ 14 июля 2018

Простое и точное решение (на примере комментария 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");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...