Неделя в PHP в DateTime-> gt; modify («на следующей неделе»)

Я думаю, что я полностью осведомлен о ISO 8601 и что первая неделя года — это неделя с понедельником. Однако в PHP (5.6) DateTime Class я столкнулся со странным поведением.

Вот мой код:

$start = new DateTime('2009-01-01 00:00');
$end = new DateTime();
$point = $start;

while($point <= $end){
echo $point->format('YW');
$point = $point->modify('next week');
}

Это правильно выдает

200901
200902
200903
...

Но если я выберу в качестве даты начала что-то ранее в 2008 году, как $start = new DateTime('2008-01-01 00:00'); тогда я получаю другой результат:

...
200852
200801 // <=== 2008??
200902
200903
...

Это ошибка PHP или я что-то здесь упускаю?

5

Решение

Возился с этим и наконец разобрался

$start = new DateTime('2008-12-29 00:00');
$end = new DateTime('2009-01-7 00:00');
$point = $start;

while($point <= $end){
echo $point->format('YW') . "\t";
echo $point->format('m-d-Y')  . "\n";
$point = $point->modify('next week');
}

Итак, первое свидание здесь 2008-12-29, таким образом Y верно. Но 2008-12-29 это также неделя 1. Итак W тоже правильно

https://3v4l.org/JZtqa

4

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

Это не ошибка! Вдохновленный @Machavity и основанный на этом этот похожий вопрос Я нашел решение:

echo $point->format('oW');

вместо

echo $point->format('YW')

производит:

...
200852
200901
200902
...

независимо от того, когда начальная дата. Это действительно случай RTM, как говорится в руководстве по PHP:

о ==>
ISO-8601 год номер. Это имеет то же значение, что и Y, за исключением того, что если
Номер недели ISO (W) относится к предыдущему или следующему году, этот год
используется вместо (добавлено в PHP 5.1.0)

0

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