Bonkers PHP几个月?

时间:2011-03-30 16:09:24

标签: php date

这是一个基本的概念验证脚本:

<?php
for($i = 1; $i < 13; $i++)
{
    echo 'Using ' . $i . ' | ';
    echo date('F', mktime(0,0,0,$i)) . " | ";
    echo date('F', strtotime('2011-' . $i . '-01')) . "<br />";
}

我得到的输出是:

Using 1 | January | January
Using 2 | March | February
Using 3 | March | March
Using 4 | April | April
Using 5 | May | May
Using 6 | June | June
Using 7 | July | July
Using 8 | August | August
Using 9 | September | September
Using 10 | October | October
Using 11 | November | November
Using 12 | December | December

二月发生了什么事?

这让我很伤心,因为它刚刚停止显示二月,并开始显示三月。

4 个答案:

答案 0 :(得分:10)

您错误地使用了mktime()

int mktime ([ int $hour = date("H") 
            [, int $minute = date("i") 
            [, int $second = date("s") 
            [, int $month = date("n") 
            [, int $day = date("j")  <------------ here 
            [, int $year = date("Y") <------------ and here
            [, int $is_dst = -1 ]]]]]]] )

如果您未指定$day$year,则默认为今天

今天是30日,2月份并不存在。

这将有效:

echo date('F', mktime(0,0,0,$i,1,2011)) . " | "; 

答案 1 :(得分:3)

非常简单 - 你在本月的29日,30日或31日运行它。 mktime(0,0,0,2)真的是mktime(0,0,0,2,date('j'),date('Y')),在今天的情况下会尝试创建2011年2月30日,也就是3月2日。

答案 2 :(得分:1)

From the manual

  

参数可能会被排除在外   从右到左;因此,任何论据   省略将设置为当前   根据当地日期和价值   时间。

因此,它将第五个参数设置为当前日期(此处为30)。这意味着它增加了日期,因为30是2月份的无效日,并使其成为游行。

答案 3 :(得分:0)