php DateTime createFromFormat功能

时间:2012-04-12 09:12:03

标签: php datetime

您好我似乎无法使datetime方法按预期工作?我可能做错了什么?

// Passes OK 
$dateTime = DateTime::createFromFormat('d/m/Y', '12/12/2012' );
var_dump($dateTime);

// should fail but returns  - 2016-09-25 
$dateTime = DateTime::createFromFormat('d/m/Y', '56/56/2012' );
var_dump($dateTime);

// correctly returns False 
$dateTime = DateTime::createFromFormat('d/m/Y', '56/56/fail' );
var_dump($dateTime);

// should fail but returns 2019-08-29 09:58:10
$dateTime = DateTime::createFromFormat('m/d/Y', '90/90/2012' );
var_dump($dateTime);

enter image description here

3 个答案:

答案 0 :(得分:46)

关于DateTime::createFromFormat的事情是它识别出两种类型的意外输入:产生错误的类型以及产生警告的类型。

'56/56/fail'之类的输入会产生错误,因此会返回false并且一切都很好。但是,'56/56/2012'不是错误而是警告,并且实际上被解析为2012年第56个月的第56天。由于2012年没有56个月,PHP内部将此更改为2016 + 8个月= 2016年8月。由于那个月没有56天,我们还有另外一个补偿到2016年9月+(56 - 31)天= 2016年9月25日。所以虽然出乎意料,这实际上是正确的。

如果您想禁止此自动调整,则必须包装DateTime工厂方法并使用DateTime::getLastErrors作为参考:

$dateTime = DateTime::createFromFormat('d/m/Y', '56/56/2012');
$errors = DateTime::getLastErrors();
if (!empty($errors['warning_count'])) {
    echo "Strictly speaking, that date was invalid!\n";
}

<强> See it in action

答案 1 :(得分:2)

PHP是一种奇怪的野兽(至少可以说)。 56/56/2012导致所有额外的月份和日期被添加到日期,直到它变得正确(上帝只知道这背后的逻辑)。

答案 2 :(得分:0)

实际上这是正确的:例如,如果您使用2012/04/31(无效日期)创建日期,则PHP返回2012/05/01(may的第一天)!

这是在幕后完成的