Вычислите, сколько "полуночников" проходит одна дата за другой в 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);