Как сделать так, чтобы недели начинались с воскресенья?

Мне нужно получить номер недели в php, где неделя должна быть рассчитана с воскресенья. По умолчанию с понедельника. Пожалуйста, помогите мне найти способ получить номер недели, считая воскресенье днем ​​начала.

В руководстве по php ISO-8601 номер недели в году, недели, начинающиеся с понедельника (добавлено в PHP 4.1.0)

Но мне нужно получить номер недели в году, недели начиная с воскресенья.

Благодарность


person Hriju    schedule 17.04.2013    source источник
comment
Эта ссылка может вам помочь: stackoverflow .com / questions / 5376484 /.   -  person    schedule 17.04.2013
comment
Получите номер недели, начиная с понедельника. Затем, если рассматриваемая дата - воскресенье, уменьшите номер недели. Будьте осторожны, чтобы не опускаться ниже 0.   -  person Jon    schedule 17.04.2013
comment
Вы хотели сказать приращение   -  person dVaffection    schedule 28.08.2013


Ответы (9)


Попробуй это:

$week = intval(date('W'));

if (date('w') == 0) {            // 0 = Sunday
   $week++;
}

echo $week;

Не уверен, что логика верна;

person silkfire    schedule 17.04.2013
comment
проверьте мой ответ, когда он пройдет годы - person hounded; 17.11.2016

Первое решение неверно 1 января 2017 г. или любого года, который начинается в воскресенье.

Попробуйте это:

$date = date('Y-m-d');
echo strftime("%U", strtotime($date ) );
person Eman Jayme    schedule 28.12.2016

Чтобы расширить ответ на silkfire и учесть, что он растягивается на годы

   if($date->format('w') == 0){
        if(date('W',strtotime($date->format('Y')."-12-31"))==52 and $date->format('W') == 52){
            $week = 1;
        }
        elseif(date('W',strtotime($date->format('Y')."-12-31"))==53 and $date->format('W') == 53){
            $week = 1;
        }
        else{
            $week++;
        }
    }
person hounded    schedule 16.11.2016
comment
31.12.2015 не работает. Если неделя начинаются в воскресенье, она должна быть 52, в то время как ваша функция возвращает 53. - person alberto-bottarini; 11.01.2018

Попробуй это. чтобы получить воскресный день надо -1 день.

$date = "2015-05-25";
echo date("W", strtotime("-1 day",strtotime($date)));
person Alghi Fari    schedule 26.05.2015

Вам следует попробовать с strftime

$week_start = new DateTime();
$week = strftime("%U");  //this gets you the week number starting Sunday
$week_start->setISODate(2012,$week,0); //return the first day of the week with offset 0
echo $week_start -> format('d-M-Y'); //and just prints with formatting 
person Foobar    schedule 17.04.2013

Я решил это так:

function getWeekOfYear( DateTime $date ) {

        $dayOfweek = intval( $date->format('w') );

        if( $dayOfweek == 0 ) {
            $date->add(new DateInterval('P1D'));
        } 

        $weekOfYear = intval( $date->format('W') );

        return $weekOfYear;
}
person ppiatek    schedule 27.12.2018

Я знаю, что эта тема старая, но это более короткий способ сделать это с помощью оператора elvis и выражения "+7 day" для strtotime ():

$week=date("W",strtotime(date("w")==1?"+7 day":"+0 day"));

если $ date ("w") возвращает истину, означает, что сегодня день между вторником и воскресеньем (1-6), поэтому мы можем вернуть сегодня неделю ('сегодня').

если возвращает false, это означает, что сегодня понедельник (0), поэтому мы должны вернуться на следующий день («+1 неделя»).

Таким образом, нам не нужно заботиться о последнем или первом дне года или проверять, есть ли в текущем году 52 или 53 недели.

Отредактировано: предыдущий ответ (и другие в этой теме) не работает в этом году, потому что январь 1-й - понедельник, поэтому он должен быть 1 неделю назад (-1 неделя), за исключением воскресенья (день 6).

date("W",strtotime(date("w")?'-7 day':'+0 day'));

Я думаю, что условие, спрашивающее, будет ли 1 января января понедельник, может сработать, но я еще не тестировал его, я вернусь с ответом позже

Для индивидуального дня вы можете использовать это:

$date = strtotime('2018-04-30'); // (it is monday)

if(date("w",strtotime(date('Y',$date).'-01-01'))==1){ // if first day of year is monday
    $week = strtotime(date('w',$date)?"-7 day":"+0 day",$date); // and today is sunday, sub a week
    $week = date("W",$week);
}else{ // if is not monday
    $week = strtotime(date('w',$date)==1?"+7 day":"+0 day",$date); // and today is monday, add a week
    $week = date("W",$week);
}
person stramin    schedule 30.04.2018

Основываясь на ответе @ silkfire:

    $year = date('Y');
    $week_no = date('W');
    if (date('w') == 0) {            // 0 = Sunday
       $week_no++;
    }
    // We shifted the week but the week still starts on a Monday.
    $weekStartDate = new DateTime();
    $weekStartDate->setISODate($year,$week_no);
    // Shift start date to Sunday
    $weekStartDate->add(DateInterval::createFromDateString('-1 day')); 
person Laith    schedule 20.05.2018

Протестировано в php 5.6 Debian 7

function getWeekNumber(\DateTime $_date)
{
    $week = intval($_date->format('W'));

    if(intval($_date->format('w')) == 0) {
        $week = intval($_date->format('W')) == ( 52 + intval($_date->format('L')) ) ? 1 : $week + 1;
    }

    return $week;
}
person Wesley Pallete    schedule 07.12.2018