9

嗨,我似乎无法让 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);

在此处输入图像描述

4

3 回答 3

52

问题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";
}

看到它在行动

于 2012-04-12T09:17:14.863 回答
2

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

于 2012-04-12T09:19:50.460 回答
0

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

这是在幕后完成的

于 2012-04-12T09:16:23.770 回答