关于php:为什么这个列表要到9月份?

Why this list just go up to september?

我有这个密码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$startYear = 2011;

 while ($startYear <= date('Y')) {
    echo"$startYear";

        for ($m=1; $m<=12; $m++) {
            $theDate = $startYear . $m;

            if ($theDate <= date('Yn')) {
                $month = date('F', mktime(0,0,0,$m, 1, $startYear));
                echo $month. '';
            }
        }
    $startYear++;
 };
?>

因为我想写一个类型的列表

二千零一十三

  • 一月
  • 二月
  • 三月
  • 四月
  • 五月
  • 六月
  • 七月
  • 八月
  • 九月
  • 十月
  • 十一月
  • 十二月

到本年和本月

但是每年的每个月都要到九月,为什么?


您必须从此处更改if语句:

1
if ($theDate <= date('Yn')) {

对此:

1
2
if ($theDate <= date('Ym')) {
                     //^ See here the placeholder for month with leading zero

有关date()的更多信息,请参阅手册:http://php.net/manual/en/function.date.php


因为201410>21049。这就是当您将date()用于不适合的日期数学时所发生的情况。

DateTime()及其相关功能更适合:

1
2
3
4
5
6
7
8
9
10
11
$startYear = 2011;

$start    = (new DateTime())->setDate($startYear,1,1);
$end      = (new DateTime())->setDate($startYear,1,1)->modify('+1 year');
$interval = new DateInterval('P1M');
$period   = new DatePeriod($start, $interval, $end);

foreach ($period as $dt) {
    echo $dt->format('F') ."
"
;
}

演示

如果您使用的是php 5.5+,它会更干净一点。

1
2
3
4
5
6
7
8
9
10
11
$startYear = 2011;

$start    = (new DateTimeImmutable())->setDate($startYear,1,1);
$end      = $start->modify('+1 year');
$interval = new DateInterval('P1M');
$period   = new DatePeriod($start, $interval, $end);

foreach ($period as $dt) {
    echo $dt->format('F') ."
"
;
}

演示


我编辑了我的代码,将一个前导零添加到表示月份号的变量中,编辑了当前日期从日期("yn")到日期("ym")并开始工作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
$startYear = 2011;


while ($startYear <= date('Y')) {
    echo"$startYear";

        for ($m=1; $m<=12; $m++) {

            $f = sprintf('%02d', $m);
            $theDate = $startYear . $f;

            if ($theDate <= date('Ym')) {
                $month = date('F', mktime(0,0,0,$f, 1, $startYear));
                echo $month. '';
            }
        }
    $startYear++;
};
?>

谢谢你们的回答。