2

为什么 php DateTime 对象不会给我输入无效日期的错误?例如,

$date_test = '13-10-31';

$datetime = new DateTime();
$date = $datetime->createFromFormat('Y-m-d', $date_test);
$date_errors = $datetime->getLastErrors();
print_r($date_errors);

结果,

Array
(
    [warning_count] => 0
    [warnings] => Array
        (
        )

    [error_count] => 0
    [errors] => Array
        (
        )

)

我已将日期格式设置为“Ymd”,即 yyyy-mm-dd,所以“13-10-31”应该是错误输入,不是吗?

编辑

如果我将此行更改$datetime->createFromFormat('Y-m-d', $date_test);

$datetime->createFromFormat('YY-m-d', $date_test);

无论我输入什么,我都会得到一个错误。例如,

$date_test = '2013-10-31';

结果,

Array
(
    [warning_count] => 0
    [warnings] => Array
        (
        )

    [error_count] => 2
    [errors] => Array
        (
            [4] => Unexpected data found.
            [10] => Data missing
        )

)

为什么!??

4

3 回答 3

5

echo $date->format('d-m-Y')显示31-10-0013,所以看起来 php 像平常一样威胁你的约会。


UPDv1:

这在docs中没有提到。尽管如此,如果你调查echo $date->format('U');它会给你一个负时间戳。

由于PHPv5.3.0这个特性得到确认,根据3v4l测试

于 2013-09-29T07:06:43.183 回答
2

您的日期是有效日期,但是您的代码不正确,因为它DateTime::createFromFormat()是一个静态函数getLastErrors()。您的示例代码应该是: -

$date_test = '13-10-31';
$date = \DateTime::createFromFormat('Y-m-d', $date_test);
$date_errors = \DateTime::getLastErrors();
print_r($date_errors);

但是,仍然不会出现错误,因为 10 月 13 日 (13-10-31) 是有效日期。当您提供'13'年份时,DateTime 将其转换为整数13,因此,它是有效的年份。

如果您想将两位数的年份视为无效,则必须编写自己的验证函数。

我建议彻底阅读PHP 日期和时间扩展文档

于 2013-09-29T07:14:33.760 回答
0

这不是因为输入的日期,而是因为 Year 参数的错误定义。

于 2013-09-29T07:16:27.630 回答