列表中省略了少于31天的月份

时间:2017-03-31 11:58:40

标签: php date

考虑以下代码昨天完美运行,但现在(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中手动更新查询,它可以正常工作,但是这个选择列表是重复日期,请看下面的图像......

enter image description here

巧合的是,所有最短日子的月份都缺失了,或者实际上已经被替换为与前一个月相同的名字?

有没有人知道为什么会这样?

3 个答案:

答案 0 :(得分:3)

这是因为当您在月份的第31个月按月循环时,您将遇到少于30天的月份。 PHP会自动将日期调整为该月的最后一天,而是转到月末,然后将剩余的天数添加到该月,并获取下一个月的日期。

所以,如果你到了二月,那里只有28天(大多数年份),它将到达第28天并增加三天并给你3月3日。

要解决此问题,您需要将日期设置为该月的第一天,然后迭代这些日期。

答案 1 :(得分:1)

这只是一个FYI,因为我意识到你已经添加了自己的答案。

您可以使用DateTime()来简化代码(如果需要)。

所以你最终会得到类似的东西:

{{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);  
          }
    }
  }
  ?>