2012-04-12 54 views
6

嗨我似乎遇到麻烦让datetime方法按预期工作?我可能做错了什么?php DateTime createFromFormat功能

// 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

回答

30

事情有关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

+0

感谢您的回复。是100%的现货,很好的解释。 – 2012-04-12 09:50:59

+0

对于检查做好准备复制/粘贴它应该有初步检查,以及: 如果(!$日期时间||空($错误[“WARNING_COUNT”])){ :) – 2016-02-26 12:14:31

1

其实这是正确的:例如,如果您创建了2012年4月31日的日期(无效日期)PHP返回2012/05/01(5月的第一天)!产生错误的种类和产生警告类型:

这场景

1

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

+1

我怀疑逻辑就是让程序员做一些懒惰的日期计算。如果你想添加90天或18个月的东西,你可以在没有进行计算的时候把数字塞进去,自己包装几个月/几年,PHP会为你排序并返回你想要的。 – 2015-01-14 12:08:03