Как я могу получить номер недели, считая воскресенье днем ​​начала?

$date = 'some date';
$todays_week = date('W',strtotime($date));

Этот код дает мне номер недели, считая понедельник первым днем ​​недели. Я хочу получить номер недели, считая воскресенье начальным днем ​​недели. Как я могу это сделать?


person Hriju    schedule 17.04.2013    source источник


Ответы (2)


Самое элегантное решение — просто добавить на вход 1 целый день:

$todays_week = date('W', strtotime($date) + 60 * 60 * 24 );

Единственный случай, когда это не работает, - это 31 декабря, а также воскресенье. В этом случае ответ будет неправильным: 1. Вам нужно будет проверить это.

person Swadq    schedule 17.04.2013

Насколько я знаю, нет никакой возможности изменить день начала. Итак, вы можете проверить, является ли текущий день воскресеньем, и если да, то увеличить номер недели на 1:

function getIsoWeeksInYear($year) {
    $date = new DateTime;
    $date->setISODate($year, 53);
    return ($date->format("W") === "53" ? 53 : 52);
}

function getWeek($date) {
    $week = date('W',strtotime($date));
    $day  = date('N',strtotime($date));
    $max_weeks = getIsoWeeksInYear(date('Y',strtotime($date)));

    if($day == 7 && $week != $max_weeks) {
        return ++$week;
    } elseif($day == 7) {
        return 1;
    } else {
        return $week;
    }
}

echo getWeek('2012-12-30');
person enenen    schedule 17.04.2013
comment
Не совсем. Помните, что номера недель по ISO 8601 варьируются от 1 до 53 включительно. Например, воскресенье, 3 января 2010 г., — это 2009 год по стандарту ISO, неделя по стандарту ISO 53. Если 1 января в понедельник, вторник, среду или четверг он приходится на неделю 01. Если 1 января приходится на пятницу, субботу или воскресенье, он приходится на неделю 52 или 53 предыдущего года (недели 00 нет). 28 декабря всегда приходится на последнюю неделю года. - person quietmint; 17.04.2013
comment
Спасибо за комментарий: +1. Я не был уверен насчет прошлой недели. Потом поменял на 53. - person enenen; 17.04.2013
comment
Не все годы ISO имеют 53 недели. Количество недель составляет либо 52, либо 53, в зависимости от различных факторов. См. дату недели ISO. Короче говоря, тестирование 28 декабря должно найти самый высокий номер недели в году (52 или 53). - person quietmint; 17.04.2013