Вычислите, сколько "полуночников" проходит одна дата за другой в PHP?

У меня есть время начала / окончания для расчета, который я пытаюсь выполнить, и у меня возникла проблема с определением, является ли время окончания до 12:00 на следующий день после времени начала. Кроме того, мне нужно посчитать, сколько дней прошло время начала.

Что у меня есть: дата начала, дата окончания

Что мне нужно: - Сколько "Полуночников" является датой окончания после даты начала?

Кто-нибудь сделал что-нибудь подобное?

1 ответ

Решение

При этом используется PHP 5.3, если у вас более ранняя версия, вам может понадобиться использовать метки времени Unix, чтобы выяснить разницу. Количество полудней должно быть разницей в количестве дней, если предположить, что время начала и окончания совпадает. Таким образом, устанавливая оба, чтобы быть полуночи их текущего дня setTime(0,0), должен сделать расчет правильно.

Использование объектов DateTime.

$start = new DateTime('2011-03-07 12:23:45');
$end = new DateTime('2011-03-08 1:23:45');

$start->setTime(0,0);
$end->setTime(0,0);

$midnights = $start->diff($end)->days;

Без использования setTime() вызовы, это приведет к 0, потому что между началом и концом меньше 24 часов. С setTime() это приводит к 1, потому что теперь разница составляет ровно 24 часа.

diff() Функция была введена в 5.3 вместе с классом DateInterval. В версии 5.2 вы все еще можете использовать класс DateTime, но вам придется вычислять общее количество дней, используя метку времени Unix.

$midnights = ($end->format('U') - $start->format('U')) / 86400

Вы можете обернуть это в abs() Функция порядка начала / конца не имеет значения.

Примечание. Эти функции могут потребоваться для тестирования в случаях, связанных с ТЛЧ.

Комментарий в документации даты php использует раунд после деления на 86400 (количество секунд в дне), чтобы противостоять любым проблемам, которые могут быть связаны с DST.

Альтернативный подход с DateTimes будет создавать их в UTC.

$utcTimezone = new DateTimeZone('UTC');
$start = new DateTime('2011-03-07 12:23:45', $utcTimezone);
$end = new DateTime('2011-03-08 1:23:45', $utcTimezone);
Другие вопросы по тегам