我正在更新一家餐厅的网站,在那里你可以订购每日菜单,菜单每周都会更改。系统只按周存储菜单,不指定年份。它有一个错误,现在(2015年第53周),如果管理员想进入第一周菜单,它会被解释为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年。在2016年的第一周,第52周应该显示2015年,但第10周应该显示的是2015年。为了实现这一点,我可以对该代码进行哪些更改?
您可以这样做,使用模运算符(%):
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