datetime — PHP-класс DatePeriod, дающий неточные результаты

У меня есть следующий простой код PHP:

$timeRange = new DatePeriod(
new DateTime('09:00:00'),
new DateInterval('PT30M'),
new DateTime('18:00:00')
);

foreach ($timeRange as $time) {
$options[$time->format('H:m')] = $time->format('H:m');
}

Я ожидаю получить список раз из этого, который начинается в 09:00, 09:30, 10:00, 10:30… и каждые полчаса до …16:30, 17:00, 17:30, 18:00,

Что я на самом деле получаю, так это список раз:

09:10, 10:10, 11:10, 12:10, 13:10, 14:10, 15:10, 16:10, 17:10

Как видите, это неверно по двум причинам: оно увеличивается на час каждый раз, а не на полчаса, и начинается в произвольное время через десять минут после часа.

Оба из них являются последовательными; например, он не основан на времени, когда я запускал код.

Я также попытался добавить жестко закодированную дату к DateTime классы, чтобы они выглядели так:

new DateTime('2018-01-01 09:00:00')

Это изменило вывод так, что все результаты были на одну минуту позже часа. Опять же, он увеличивается на час каждый раз.

Я не могу объяснить это поведение. Кажется, это совершенно неправильно. Может кто-нибудь объяснить это, и скажите мне, что мне нужно сделать, чтобы это исправить.

Я могу, конечно, вернуться к использованию меток времени; У меня есть код для этого, который уже работает. Но я хотел бы знать, что происходит с DatePeriod,

Для справки, это работает под PHP 7.2.4.

0

Решение

$options[$time->format('H:m')] = $time->format('H:m');

m идентификатор месяца Ты хочешь i:

$options[$time->format('H:i')] = $time->format('H:i');
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]