PHP CreateFromFromFormat()月&仅限年份

时间:2016-03-30 11:48:12

标签: php datetime date-format datetime-format time-format

我正在尝试使用Datetime Class从格式创建数据,如下所示

$date = DateTime::createFromFormat('m-Y', '02-2016');
echo $date->format('Y-m-d');

外出2016-03-01,我期待得到2016-02-01

这是一个错误吗?或者我以错误的方式低估了这个功能?

2 个答案:

答案 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