使用date和mktime()生成日期列表时缺少一个月

时间:2013-01-30 15:33:38

标签: php date datetime

我试图生成一个月份列表以及该月的年份和第一个日期。

我使用下面的代码,但奇怪的是2月丢失,3月重复2次

代码

        for ($i = 1; $i <= 12; $i++):

        $year='2013';

        $month_numb = date($year.'-m-01', mktime(0,0,0,$i));

        echo $month_numb.'<br>';

        endfor;

输出

2013-01-01
2013-03-01
2013-03-01
2013-04-01
2013-05-01
2013-06-01
2013-07-01
2013-08-01
2013-09-01
2013-10-01
2013-11-01
2013-12-01

有人能告诉我为什么会这样,我该如何解决?

6 个答案:

答案 0 :(得分:2)

今天是1月30日。今年2月的日期只有28个。 mktime()使用今天的日期表示未提供的值。由于2月30日无效,mktime()将转到下一个有效日期 - 01 March 2013

更改您的代码

for ($i = 1; $i <= 12; $i++):
    $month_numb = date('Y-m-01', mktime(0,0,0,$i, 1, 2013));
    echo $month_numb.'<br>';
endfor;

以上内容将日期/年份分配给代码,然后对其进行翻译,而不是采用今天的值。

答案 1 :(得分:2)

当调用mktime()时,月份的默认日期是当月的当天(在今天的情况下,它是30)。由于2月30日实际上是3月2日(大部分时间),这就是为什么mktime(0 ,0,0,2)将返回3月份。

将当天的日期设为mktime,mktime(0,0,0,$ i,1)。

答案 2 :(得分:1)

没有datemktime

,这样做不是更好吗?
$year = 2013;
for ( $i = 1; $i <= 12; $i++ ) {
  $month_numb = $year . '-' . $i . '-01';
  echo $month_numb . '<br/>';
}

答案 3 :(得分:0)

使用DateTime。这更简单:

$datetime = new DateTime('2013-01-01');
for ($i = 1; $i <= 11; $i++)
{
    echo $datetime->format('Y-m-d') . "<br>\n";
    $datetime->modify('+1 month');
}

See it in action

答案 4 :(得分:0)

这是因为今天是第30次。并且没有2月30日。明天你将在30天内的所有月份都遇到同样的问题。 2月1日,你的问题将再次消失。

修复,添加第5个参数,不要让月份的日期默认为今天的日期:

$month_numb = date($year.'-m-01', mktime(0,0,0,$i, 1));

答案 5 :(得分:0)

mktime的第五个参数将设置为今天的日:(来自docs... int $day = date("j") ...),即30(1月份)。 2月30日不存在,所以它将持续到3月。

你会发现它会在2月1日正常工作。