我试图生成一个月份列表以及该月的年份和第一个日期。
我使用下面的代码,但奇怪的是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
有人能告诉我为什么会这样,我该如何解决?
答案 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)
没有date
和mktime
$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');
}
答案 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日正常工作。