您好我似乎无法使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);
答案 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的第一天)!
这是在幕后完成的