PHP - получить первый день заданного номера недели, если неделя начинается в день, отличный от понедельника

В моем приложении PHP есть три переменные:

Код:

$year = 2014
$weeknumber = 1
$weekstarts = 6 //Week starts on Saturday. 1=Monday... 6=Saturday and 7=Sunday

По этим трем параметрам я хотел бы выяснить, какой сегодня первый день недели. В этом случае первая неделя 2014 года, когда неделя начинается в субботу, будет 28 декабря 2014-01-04.

В течение нескольких недель, которые начинаются с понедельника, я могу легко понять это с помощью:

Код:

$first_day_of_week = strtotime( $year . "W" . "0".$weeknumber)

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


person oabarca    schedule 07.01.2014    source источник
comment
Действительно сложно сказать, о чем вы спрашиваете. Вы пытаетесь узнать, какая была предыдущая суббота для данной даты?   -  person davethegr8    schedule 08.01.2014
comment
Мы говорим о реальных числах недель или просто «какая бы ни была первая неделя с датой в этом году, отсчитываемой от моего дня начала, это будет неделя 1»?   -  person Wrikken    schedule 08.01.2014
comment
@ davethegr8 можете ли вы реализовать свою идею?   -  person oabarca    schedule 08.01.2014
comment
@Wrikken фактические номера недель   -  person oabarca    schedule 08.01.2014
comment
Итак, суббота на неделе 1 - 4 января 2014 г. Это подводит нас к вопросу: если мы изменим день, в который она начинается: должны ли мы идти вперед, назад , или какое-то нестандартное правило?   -  person Wrikken    schedule 08.01.2014
comment
@Wrikken Спасибо, что указали на это. Ты прав. Согласно стандарту ISO, первая неделя 2014 года, когда неделя начинается в субботу, - это 4 января 2014 года. Теперь я могу использовать DateTime :: setISODate, как предложил Главич   -  person oabarca    schedule 08.01.2014


Ответы (1)


Используйте DateTime::setISODate, где третий параметр - день недели:

$dt = new DateTime;
echo $dt->setISODate(2014, 1, 0)->format('Y-m-d'), "\n"; # 0 = Sunday
echo $dt->setISODate(2014, 1, 1)->format('Y-m-d'), "\n"; # 1 = Monday
echo $dt->setISODate(2014, 1, 6)->format('Y-m-d'), "\n"; # 6 = Saturday

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


Ваш пример не работает, потому что вы используете формат yyyyWweek, который по умолчанию - понедельник. Прочтите о форматах ISO-8601, и вы увидите, что существует формат yyyy-Wweek-day, который вы можете использовать как:

$format = sprintf("%d-W%02d-%d", $year, $weeknumber, $weekstarts == 7 ? 0 : $weekstarts);
$first_day_of_week = strtotime($format);
echo "$format returned $first_day_of_week\n";

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

person Glavić    schedule 08.01.2014
comment
Спасибо, что упомянули эту функцию. Однако я видел в Календаре Google, что первым днем ​​первой недели 2014 года, начинающейся с субботы, является суббота, 28 декабря 2013 года, а не суббота, 4 января. - person oabarca; 08.01.2014
comment
@ user2070775: первая неделя ISO 2014 начинается 30 декабря 2013 года. Вы говорите о последней неделе 2013 года, где, исходя из дня субботы, она начинается 28 декабря 2013 года. Если вы хотите получить ПРЕДЫДУЩУЮ неделю из текущей / выбранной, все, что вам нужно сделать, это вычесть номер недели на 1. Как я уже сказал, вы должны сначала прочитать, что представляет собой ISO-8601, а затем посмотреть, что вам нужно для вашего приложения. - person Glavić; 08.01.2014
comment
В приложении Google Calendar для Android 4.3 указано, что первая неделя 2014 года, когда неделя начинается в субботу, приходится на 28 декабря 2013 года. Возможно, они не следуют стандарту ISO - person oabarca; 08.01.2014