Как получить календарную неделю с учетом года? date (W) возвращает 52 на 1 января

Как говорится в заголовке, функция PHP date ("W") возвращает календарную неделю (для текущего дня). К сожалению, он дает 52 или 53 за первый день (дни) большинства лет. С простой точки зрения, это правильно, но очень раздражает, поскольку 1 января 2012 года - это не 52 календарная неделя, это НЕ календарная неделя текущего года. В большинстве календарей это определяется как неделя 0 или неделя 52 предыдущего года.

Это очень сложно, когда вы группируете каждый день года по календарной неделе: 1 января 2012 года и 31 декабря 2012 года помещаются в одну и ту же группу календарных недель.

Итак, мой вопрос: существует ли (родная) альтернатива дате PHP ("W") с учетом года?

РЕДАКТИРОВАТЬ: Я думаю, что я написал первую версию этого вопроса очень неясным образом, так что это мое редактирование: я ищу функцию, которая возвращает правильную календарную неделю для первого дня (дней) года. Дата PHP («W») возвращает 52 на 1 января 2012 года, что «неверно». Это должно быть 0 или ноль. Согласно официальным источникам, первая календарная неделя в году начинается в первый понедельник года. Итак, если первый день года не понедельник, значит, это не первая неделя! Сейчас неделя 0. В статье в Википедии говорится

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

Это становится непросто, поскольку последние дни года также находятся на 52/53 неделе. дата ("W") не делится на текущий год и предыдущий год.


person Sliq    schedule 26.07.2012    source источник
comment
ИНФОРМАЦИЯ: Начало недели разное в зависимости от культуры и страны. Например, в Северной Америке неделя начинается в ВОСКРЕСЕНЬЕ (!). Что, черт возьми, с вами, американцы, неделя просто не начинается в воскресенье? ;) Afaik есть также страны, которые определяют среду как первый день недели.   -  person Sliq    schedule 30.12.2013
comment
кстати, похожая проблема теперь является самым популярным комментарием на странице документа даты PHP: php.net/manual/de/function.date.php#106974   -  person Sliq    schedule 26.07.2014


Ответы (3)


Это решение преобразует избыток декабря в неделю 53 и все в январе до недели 1 в неделю 0.

$w=(int)date('W');
$m=(int)date('n');
$w=$w==1?($m==12?53:1):($w>=51?($m==1?0:$w):$w);

echo "week $w in ".date('Y');

2013-12-31 ==> 53 неделя 2013 года

2014-01-01 ==> неделя 1 в 2014 году

2015-12-31 ==> 52 неделя 2015 года

2016-01-01 ==> неделя 0 в 2016 году

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

$id=array(25,26,27,28,29,30,31,1,2,3,4,5,6,7,8);        
for($iy=2013;$iy<2067;++$iy){foreach($id as $k=>$v){if($k<7){$im=12;}else{$im=1;}
if($k==7){++$iy;echo '====<br>';}$tme=strtotime("$im/$v/$iy");
echo date('d-m-Y',$tme),'  * *  ';
//THE ACTUAL CODE =================
    $w=(int)date('W',$tme);
    $m=(int)date('n',$tme);
    $w=$w==1?($m==12?53:1):($w>=51?($m==1?0:$w):$w);
//THE ACTUAL CODE =================
echo '<b>WEEK: ',$w,' --- ','YEAR: ',date('Y',$tme),'</b><br>';}--$iy;
echo '----------------------------------<br>';}
person Michel    schedule 30.12.2013

Есть ли (родная) альтернатива дате PHP ("W") с учетом года?

Нет, нет.

Согласно официальным источникам, первая календарная неделя в году начинается в первый понедельник года.

Я не уверен, на какие официальные источники вы ссылаетесь.

PHP date("W") возвращает номер недели в соответствии с ISO 8601. Как международный стандарт, ISO 8601 считается одним из многих, возможно, «официальных источников». Если его определение номеров недель не подходит для вашего приложения, вы можете использовать все, что захотите.

Если вы используете нестандартное определение «первой недели года», или если вы используете официальный источник, который не получил широкого признания, ожидайте, что вам придется написать свою собственную функцию для замены date("W"). (Я почти уверен, что вам нужно написать функцию.)

Дата 01.01.2012 было воскресенье. ISO 8601, Wikipedia и php соглашаются, что номер недели ISO за 01.01.2012 52 года.

ISO 8601 не определяет неделю 0.

Итак, если первый день года не понедельник, значит, это не первая неделя!

Ни ISO, ни Википедия этого не говорят. ISO 8601 определяет неделю номер 1 как неделю, в которую входит первый четверг года. В 2012 году первый четверг приходился на 5 января, поэтому неделя номер 1 приходилась на 2–8 января. 2012-01-01 приходился на последнюю неделю предыдущего года с точки зрения недель ISO.

Если вы хотите чего-то другого, вы можете поиграть с арифметикой, делением и т. Д. (Попробуйте, например, разделить дату («z») на 7.) Или вы можете сохранить эти данные в базе данных и назначать недели как вам угодно.

Если вы имеете дело с отчетными периодами, я бы почти наверняка сохранил эти данные в таблице в базе данных. Сгенерировать такие данные с помощью электронной таблицы довольно просто.

Текст данных в таблице намного легче проверять, чем текст функции php, независимо от того, насколько проста эта функция. И данные обязательно будут одинаковыми для любой программы, которая обращается к ней, независимо от того, на каком языке она написана. (Так что, если в вашей базе данных когда-нибудь будут программы, написанные на 5 разных языках, которые обращаются к ней, вам не нужно писать, тестировать, и поддерживайте 5 различных функций, чтобы получить номер недели.)

person Mike Sherrill 'Cat Recall'    schedule 01.08.2012
comment
Ну, ты только что повторил то, что я сказал. 1 января 2012 года может быть 52 неделей (2011 года), но это совершенно бесполезно почти во всех финансовых или технических расчетах. Вот почему я попросил ЧУВСТВИТЕЛЬНУЮ ПО ГОДУ ВЕРСИЮ ДАТЫ (). Я не говорил, что дата () неверна. Чтобы еще больше прояснить, в чем проблема: если у вас есть неделя для каждого дня в году, вы столкнетесь с серьезными проблемами, потому что 1 января и 31 декабря находятся на 52 неделе. - person Sliq; 01.08.2012
comment
между прочим: пожалуйста, перестаньте верить каждой строчке Википедии! Это просто общедоступный сайт, где каждый может скопировать / вставить все. Википедия не является официальным источником. И содержание английского сайта не равно содержанию всех других языков и стран. Например, есть другое финансовое определение недели, в малых странах она начинается в воскресенье, afaik. - person Sliq; 01.08.2012
comment
Я не говорил, что дата () неверна. Вы сказали, что дата PHP (W) возвращает 52 на 1 января 2012 года, что «неправильно». Это должно быть 0 или ноль. Но в этом нет ничего плохого, и это не так. Он правильно выполняет задокументированное поведение в соответствии с международными стандартами. (пожимает плечами) - person Mike Sherrill 'Cat Recall'; 01.08.2012
comment
Если у вас будет неделя для каждого дня в году, вы столкнетесь с серьезными проблемами, потому что 1 января и 31 декабря находятся на 52 неделе. Будет ли это неприятным, полностью зависит от приложения. Очевидно, что это беспокоит ваше приложение, поэтому вам, вероятно, следует написать функцию (или сохранить данные в таблице), чтобы использовать ее вместо date("W"). - person Mike Sherrill 'Cat Recall'; 01.08.2012

person    schedule
comment
Извините, но я искал не это. - person Sliq; 26.07.2012
comment
Да, это возвращает неделю первого понедельника года, которая ВСЕГДА является неделей 1. Я ищу функцию, которая возвращает правильную неделю для первого дня 2012 года (которая будет равна 0 или нулю, а не 52. ) - person Sliq; 26.07.2012
comment
Я никогда не слышал о нулевом номере недели, 1-й мне кажется правильным. - person nickb; 26.07.2012
comment
@Panique - функция должна возвращать 0 / ноль до начала недели / понедельника? - person FatalError; 26.07.2012
comment
@nickb;) Вопрос переписал. 1 января 2012 года НЕ 52-я неделя, но дата (W) говорит об этом. У меня должна быть нулевая неделя, потому что первая неделя 2012 года начинается в понедельник, 2 января. Это официальный способ определения календарных недель, по крайней мере, в большинстве стран (за исключением США и Великобритании). - person Sliq; 26.07.2012
comment
@FatalError Точно! Это официальное (европейское?) Определение календарной недели. - person Sliq; 26.07.2012