Я думаю, что я полностью осведомлен о 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 или я что-то здесь упускаю?
Возился с этим и наконец разобрался
$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
тоже правильно
Это не ошибка! Вдохновленный @Machavity и основанный на этом этот похожий вопрос Я нашел решение:
echo $point->format('oW');
вместо
echo $point->format('YW')
производит:
...
200852
200901
200902
...
независимо от того, когда начальная дата. Это действительно случай RTM, как говорится в руководстве по PHP:
о ==>
ISO-8601 год номер. Это имеет то же значение, что и Y, за исключением того, что если
Номер недели ISO (W) относится к предыдущему или следующему году, этот год
используется вместо (добавлено в PHP 5.1.0)