我正在尝试使用Datetime Class从格式创建数据,如下所示
$date = DateTime::createFromFormat('m-Y', '02-2016');
echo $date->format('Y-m-d');
外出2016-03-01,我期待得到2016-02-01
这是一个错误吗?或者我以错误的方式低估了这个功能?
答案 0 :(得分:3)
如果您提供月份和年份,则PHP将使用当前当月(即30)的当天提供默认日期
这给出了一个有效的2016-02-30,这不是有效日期.....但PHP允许这些类型的值,其中天数高于/低于月份的天数,月份高于/低于一年中的几个月,只是增加/减少到有效日期.....在这种情况下,在2016年2月或2016年(2016年2月29日)的最后一天之后的另外一天,将给予2016年3月1日
修改强>
Reference for day/month overflow/underflow behaviour
注意:强> dd和DD格式可以上下溢。第0天表示上个月的最后一天,而溢出计入下个月。这使得" 2008-08-00"相当于" 2008-07-31"和" 2008-06-31"相当于" 2008-07-01" (六月只有30天)。 也可以使用值0对mm和MM格式进行下溢。月值0表示上一年的12月。例如" 2008-00-22"相当于" 2007-12-22"。 如果你结合前两个事实并在当天和月份下溢,则会发生以下情况:" 2008-00-00"首先转换为" 2007-12-00"然后转换为" 2007-11-30"。字符串" 0000-00-00"也会发生这种情况,它会被转换为" -0001-11-30" (ISO 8601日历中的第-1年,即公元前2世纪的格里高利历)。
答案 1 :(得分:0)
这是known bug ...或记录的功能,具体取决于您如何看待它。有关详细信息,请参阅Mark Baker的答案。
要获得您期望的日期,只需将01
添加到您的输入中,作为该月中某天的值。
$input = '02-2016';
$date = DateTime::createFromFormat('d-m-Y', '01-' . $input);
echo $date->format('Y-m-d');
// OUTPUT : 2016-02-01