Почему strftime('%G', strtotime('2017-01-01')) производит 2016 год?

Я нашел возможную ошибку в PHP 5.6. Функция strftime с параметром %G генерирует 4-х значный год. Тем не менее, кажется, вернется не тот год, когда кормили 1483246800 - т.е. 1 января 2017 года. Вместо этого возвращается 2016!

Пример кода:

echo strftime('%G', strtotime('2017-01-01'));

Это должно вывести "2017", но вместо этого я получу "2016". Я использую PHP 5.6. Этот крайний случай также проявляется для других лет - например, 2016-01-03 выводит 2015 вместо 2016 года.

1 ответ

Это не ошибка.

Как кто-то указал в ответе на сообщение об ошибке, кто-то еще подал некоторое время назад:

% G - 4-значный год, соответствующий номеру недели ISO (см.%V). Он имеет тот же формат и значение, что и%Y, за исключением того, что если номер недели ISO относится к предыдущему или следующему году, вместо этого используется этот год... Напоминание о номерах недель ISO. Они начинаются по понедельникам, заканчиваются по воскресеньям и считаются частью года, в который выпадает большинство их дней.

Это означает, что с помощью %G для даты, близкой к началу / концу года, может быть указан правильный год, предыдущий год, как в вашем случае, или следующий год (например, echo strftime('%Y', strtotime('2002-12-30)) дает 2003).

Если вы хотите получить правильный год, вы должны использовать %Y вместо. echo strftime('%Y', strtotime('2017-01-01')); дает 2017.

Также стоит проверить определение% V:

ISO-8601: номер недели 1988 года данного года, начиная с первой недели года, по крайней мере, с 4 рабочими днями, причем понедельник является началом недели.

Другие вопросы по тегам