php получить правильную дату к первой неделе года, используя strtotime

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

echo date('Y-m-d',strtotime('2018W01'));   #JAN 1 is Monday, returned 01/01
echo date('Y-m-d',strtotime('2013W01'));   #JAN 1 is Tuesday, returned 12/31
echo date('Y-m-d',strtotime('2014W01'));   #JAN 1 is Wednesday, returned 12/30
echo date('Y-m-d',strtotime('2015W01'));   #JAN 1 is Thursday, returned 12/29
echo date('Y-m-d',strtotime('2016W01'));   #JAN 1 is Friday, returned 01/04!? (shouldn't it be 12/28)
echo date('Y-m-d',strtotime('2022W01'));   #JAN 1 is Saturday, returned 01/03!? (shouldn't it be 12/27)
echo date('Y-m-d',strtotime('2017W01'));   #JAN 1 is Sunday, returned 01/02!? (shouldn't it be 12/26)

Поскольку PHP, который больше 5.2.7, показывает мне, что понедельник — это 1-й день недели, я надеялся, что 2017 год, 1-й день недели, должен быть 12/26. Есть ли где-нибудь конфигурация номера недели, чтобы PHP правильно отображал 1-й день, неделю, год для каждого года? ТИА


person xam    schedule 07.01.2015    source источник


Ответы (1)


echo date('Y-m-d',strtotime('2016W01'));
#JAN 1 is Friday, returned 01/04!? (shouldn't it be 12/28)

Нет, это не должно быть 28 декабря, потому что первая неделя года имеет следующие правила:

  • Это первая неделя с большинством (4 или более) дней в январе.
  • Его первый день - ближайший к 1 января понедельник.
  • В нем 4 января. Следовательно, самые ранние возможные даты — с 29 декабря по 4 января, самые поздние — с 4 по 10 января.
  • В нем указан первый рабочий день года, если суббота, воскресенье и 1 января не рабочие дни.

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

Другие примеры также верны. Подробнее читайте здесь.

person Glavić    schedule 07.01.2015
comment
Это то, чего я боялся ... Есть ли способ настроить PHP так, чтобы он не использовал систему нумерации недель ISO или григорианского календаря? Чтобы strtotime выдавал 12/28, 12/27 и 12/26? Или единственный способ - обойти и определить, попадает ли год JAN 1 с пятницы по воскресенье, если это так, номер недели минус 1? Неделя не обязательно должна начинаться в понедельник, мне просто нужно, чтобы php систематически давал неделю # без специального правила, требующего, чтобы 4 дня считались неделей №1. Я надеялся, что всего 1 дня будет достаточно, чтобы считаться неделей №1. Спасибо за ваш ответ, и TIA - person xam; 07.01.2015
comment
@xam: я не знаю, зачем вам нужна собственная логика в отношении нумерации недель? Вы используете стандарт ISO, когда используете формат YEAR-W0x. Если вам нужна какая-то пользовательская логика, вам нужно будет сделать ее самостоятельно, это не нативные функции; но я бы предпочел использовать стандарт ISO, чем создавать какую-то пользовательскую логику... - person Glavić; 07.01.2015
comment
Изменение стандарта не входит в мои намерения. Я бы никогда не догадался, что для стандарта потребуется 4 дня, чтобы считаться неделей 1. Вероятно, это стандарт ISO... будут ли какие-либо другие стандарты, которые также может использовать PHP? Я наивно думал, что 1-я неделя года требует только 1-го дня года. Если я могу использовать другой стандарт, изменив формат, я хотел бы попробовать. Спасибо и ТИА. - person xam; 07.01.2015
comment
@xam: ISO8601 просто говорит, что первая или последняя неделя относится к году, в котором больше всего дней (что для меня имеет смысл). Итак, если в декабре 4+ дня, неделя принадлежит году X; если 4+ дня в январе, то неделя принадлежит году X+1. Нет никакого стандарта, о котором я должен знать, который делает неделю 1 только теми неделями, у которых все дни в январе... Но теперь, когда вы знаете, как работает этот ISO, почему бы не использовать его? - person Glavić; 08.01.2015
comment
Я поработал и исправил некоторые ошибки, вызванные этой концепцией, спасибо. - person xam; 09.01.2015