1

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

我使用下面的代码,但奇怪的是,二月不见了,三月被重复了 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

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

4

6 回答 6

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;

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

于 2013-01-30T15:38:54.383 回答
2

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

将月份中的某天指定给 mktime,mktime(0,0,0,$i,1)。

于 2013-01-30T15:41:39.473 回答
1

没有dateand不是更好mktime吗?

$year = 2013;
for ( $i = 1; $i <= 12; $i++ ) {
  $month_numb = $year . '-' . $i . '-01';
  echo $month_numb . '<br/>';
}
于 2013-01-30T15:37:10.617 回答
0

使用日期时间。它更简单:

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

看到它在行动

于 2013-01-30T15:36:44.263 回答
0

这是因为今天是 30 号。而且没有 2 月 30 日。明天你会遇到同样的问题,所有月份只有 30 天。2 月 1 日,您的问题将再次消失。

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

$month_numb = date($year.'-m-01', mktime(0,0,0,$i, 1));
于 2013-01-30T15:38:29.300 回答
0

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

你会看到它会在 2 月 1 日正常工作。

于 2013-01-30T15:41:37.133 回答