date — Как настроить неделю и год для системы заказа меню в Stack Overflow

Я обновляю сайт ресторана, где вы можете заказать ежедневное меню, а меню меняется еженедельно. Система сохраняет меню только по неделям, без указания года. В ней была ошибка, которая теперь (53-я неделя 2015 года), если администратор хотел войти в меню 1-й недели, интерпретировалась как 1-я неделя 2015 года.
Я хочу изменить это, чтобы позволить им ввести + -10 недель в следующем году и вернуться к старому году в январе.
Пока мой код выглядит следующим образом, но я уверен, что он не даст правильного года после марта:

$year = date("Y");
$current_week = date("W");
$w_diff = abs($current_week - $week_number);

// If there is a year change (lower or higher current week and edit week) and it is within 10 weeks, we edit the other year, otherwise current year
// This code is imperfect, need to check mid year as it does not work
if ($current_week > $week_number && $w_diff >= 10) {$year++;}
elseif ($current_week < $week_number && $w_diff >= 10) {$year--;}

$ week_number количество недель, которое администратор хочет редактировать в меню. То, что я хочу: если администратор хочет изменить 9-ю неделю сейчас, он должен отредактировать 2016 год, но если он хочет увидеть 40-ую неделю, он должен показать 2015. В 1-ю неделю 2016 года, на 52-й неделе, он должен показать 2015, но для 10 неделя это должно показать 2015.
Что я могу изменить в этом коде, чтобы добиться этого?

0

Решение

Вы можете сделать что-то вроде этого, используя оператор по модулю (%):

function get_year($current_year, $current_week, $week_number, $max_forward) {
$forward = (53 + $week_number - $current_week) % 53 <= $max_forward;
if ($forward == $week_number < $current_week) {
$year += $forward ? 1 : -1;
}
return $year;
}

Четвертый аргумент устанавливает правило, когда неделя считается будущей. Таким образом, вы пропустили бы 10, чтобы указать, что можете смотреть на 10 недель вперед, но любое дальнейшее будет фактически интерпретироваться как оглядывание назад.

Чтобы проверить вышеуказанную функцию, вы можете сделать что-то вроде этого:

// test
echo "curr \tweek \tyear<br>";
for ($current_week = 1; $current_week < 52; $current_week += 10) {
for ($week_number = 1; $week_number < 52; $week_number += 10) {
$year = get_year(2015, $current_week, $week_number, 10);
echo "$current_week \t$week_number \t$year<br>";
}
}

Выход:

curr    week    year
1       1       2015
1       11      2015
1       21      2014
1       31      2014
1       41      2014
1       51      2014
11      1       2015
11      11      2015
11      21      2015
11      31      2014
11      41      2014
11      51      2014
21      1       2015
21      11      2015
21      21      2015
21      31      2015
21      41      2014
21      51      2014
31      1       2015
31      11      2015
31      21      2015
31      31      2015
31      41      2015
31      51      2014
41      1       2015
41      11      2015
41      21      2015
41      31      2015
41      41      2015
41      51      2015
51      1       2016
51      11      2015
51      21      2015
51      31      2015
51      41      2015
51      51      2015
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]