为什么这份名单只到九月份?

Why this list just go up to september?

我有这个代码

<?php
$startYear = 2011;

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

        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. '<br>';
            }
        }
    $startYear++;
 };
?>

因为我想写一个

类型的列表

2013

直到当年和现在月份

但是每年的每个月份列表都只到 9 月,为什么?

你必须改变你的 if 语句:

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

对此:

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() 及其相关函数更适合于此:

$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') . "\n";
}

Demo

如果您使用的是 PHP 5.5+,它会更干净一些

$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') . "\n";
}

Demo

我编辑了我的代码,为代表月份的变量添加了一个前导零,将当前日期从日期 ('Yn') 编辑为日期 ('Ym') 并且有效。

<?php
$startYear = 2011;


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

        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. '<br>';
            }
        }
    $startYear++;
};
?>

谢谢大家的回答。