考虑以下代码昨天完美运行,但现在(3月30日),它已停止工作...
<form class="date">
<select name="date" onchange="this.form.submit()">
<?php
for ($i = 0; $i <= 60; ++$i) {
$time = strtotime(sprintf('+%d months', $i));
$value = date('Y-m', $time);
$label = date('F Y', $time);
$nowvalue = date('Y-m');
$nowlabel = date('F Y');
if(isset($_GET['date'])) {
if(strcmp($value,$_GET['date']) == 0) {
//If 0, $value and $_GET['date'] are the same: The option is selected
printf('<option value="%s" selected>%s</option>', $value, $label);
} else {
printf('<option value="%s">%s</option>', $value, $label);
}
} else {
if($value == $nowvalue) {
printf('<option value="%s" selected>%s</option>', $value, $label);
} else {
printf('<option value="%s">%s</option>', $value, $label);
}
}
}
?>
</select>
</form>
这将输出即将到来的月份的选择列表,即onchange,使用该页面上日历的URL中的不同查询重新加载页面以作出反应。
如果我在URL中手动更新查询,它可以正常工作,但是这个选择列表是重复日期,请看下面的图像......
巧合的是,所有最短日子的月份都缺失了,或者实际上已经被替换为与前一个月相同的名字?
有没有人知道为什么会这样?
答案 0 :(得分:3)
这是因为当您在月份的第31个月按月循环时,您将遇到少于30天的月份。 PHP会自动将日期调整为该月的最后一天,而是转到月末,然后将剩余的天数添加到该月,并获取下一个月的日期。
所以,如果你到了二月,那里只有28天(大多数年份),它将到达第28天并增加三天并给你3月3日。
要解决此问题,您需要将日期设置为该月的第一天,然后迭代这些日期。
答案 1 :(得分:1)
答案 2 :(得分:0)
正如John Conde所指出的那样,这是因为今天的日期(第31次)加上一个月是实际的5月1日,而4月则被跳过。
我做了以下操作,将日期设置为月份的第1天,再加上一个月......
<?php
for ($i = 0; $i <= 60; ++$i) {
$firstofthismonth = '01-' . date('m-Y');
$time = strtotime(sprintf($firstofthismonth . '+%d months', $i));
$value = date('Y-m', $time);
$label = date('F Y', $time);
$nowvalue = date('Y-m');
$nowlabel = date('F Y');
if(isset($_GET['date'])) {
if(strcmp($value,$_GET['date']) == 0) {
//If 0, $value and $_GET['date'] are the same: The option is selected
printf('<option value="%s" selected>%s</option>', $value, $label);
} else {
printf('<option value="%s">%s</option>', $value, $label);
}
} else {
if($value == $nowvalue) {
printf('<option value="%s" selected>%s</option>', $value, $label);
} else {
printf('<option value="%s">%s</option>', $value, $label);
}
}
}
?>