Может кто-нибудь объяснить, как дата («YW», strtotime («2016-01-02»)); возвращает «201653»?

date("YW", strtotime("2016-01-02")); returns “201653”

Год в порядке
Неделя с 2015 года

3

Решение

PHP это ISO-8601 соответствует датам:

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

Это означает, что первая неделя года определяется как:

неделю с первым четвергом года

Если 1 января — в понедельник, вторник, среду или четверг, то это на неделе 01. Если 1 января — на пятницу, субботу или воскресенье, то это на неделе 52 или 53 предыдущего года (недели 00 нет). ,

Это означает, что 2 января 2016 года не на первой неделе 2016 года, что касается PHP.

Если вы используете o флаг для date() Вы получите ISO-8601 год, который вернется в 2015 году:

echo date("oW", strtotime("2016-01-02"));
// outputs: 201553

демонстрация

Один из способов, который вы можете рассмотреть, — это проверить, является ли месяц январем, а номер недели — 53, тогда это первая неделя нового календарного года (а не года ISO-8601).

if (date('n') == 1 && date('W') == 53) {
// first calendar week of the year
}

демонстрация

3

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

PHP использует номер недели по ISO-8601, начиная с понедельника. Если 1 января года не в понедельник, эта конкретная неделя считается последней неделей предыдущего года; 53 неделя

Поскольку 1 января 2016 года было пятницей, это часть недели, начинающейся 28 декабря 2015 года. Если вы запустите код echo date('Y-W', strtotime('2015-12-31')); вы получите вывод «2015-53», поэтому дни той же недели также будут 53-й неделей в соответствии с ISO-8601.

1

PHP использует спецификацию ISO-8601 для номеров недель.

Определение первой недели года (ISO 8601):

Есть взаимно эквивалентные описания недели 01:

  • неделю с первым четвергом года (формальное определение ISO),

  • неделю с 4 января,

  • первая неделя с большинством (четыре или более) дней в начальном году, и

  • неделя, начинающаяся с понедельника в период с 29 декабря по 4 января.

Если 1 января в понедельник, вторник, среду или четверг, то это на неделе 01.
Если 1 января в пятницу, субботу или воскресенье, то это на 52 или 53 неделе предыдущего года (недели 00 нет). 28 декабря всегда последняя неделя года.
https://en.wikipedia.org/wiki/ISO_8601#Week_dates

Вот пример:

echo date("YW", strtotime("2016-01-02")); //201653
echo date("YW", strtotime("2016-01-04")); //201601
1
По вопросам рекламы [email protected]