【问题标题】:php DateTime object does not give me errors for an invalid date input?php DateTime 对象不会给我输入无效日期的错误?
【发布时间】:2013-10-05 04:53:56
【问题描述】:

为什么 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
        (
        )

)

我已将日期格式设置为“Y-m-d”,即 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
        )

)

为什么!??

【问题讨论】:

  • $date 看起来像什么?如果你不使用$date,那条线($date = $datetime->createFromFormat('Y-m-d', $date_test);)是如何做的?
  • 10=10 月有 31 天仍然有效。
  • 正如@Corrupt 回答的那样,13 被翻译为13AD(Anno Domini)。非常多的有效日期。
  • @Lenin 我想补充一下,第 13 年也是有效的,尽管大多数在那一年生活的人已经死了。
  • 'DateTime::createFromFormat()' 是一个静态函数。

标签: php datetime php-5.4


【解决方案1】:

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


UPDv1:

docs 中没有提到这一点。不过,如果您查看echo $date->format('U');,它会给您一个负时间戳。

由于PHPv5.3.0,此功能得到确认,根据3v4l test

【讨论】:

  • 有趣的是,在我的 Windows 系统上,$date->getTimestamp() 返回 false,而 $date->format('U') 给出了预期的负时间戳。不过,它在我的 linux 机器和 here 上运行良好。奇怪
  • 您的测试以非静态方式调用createFromFormat()
【解决方案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 月 31 日 13 日 (13-10-31) 是有效日期,因此仍然不会出现错误。当您提供 '13' 作为年份时,DateTime 会将其转换为整数 13,因此它是有效的年份。

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

我建议彻底阅读PHP Date and Time extensions documentation

【讨论】:

  • @lauthiamkok 当然不是!正如我在回答 13-10-31 中明确指出的那样是有效日期
【解决方案3】:

这不是因为输入的日期,而是因为年参数的定义不正确。

【讨论】:

  • 请在此处查看完整的日期格式php.net/manual/en/function.date.php
  • 您是否预计年份的前导零小于 4 位? @lauthiamkok
  • 我在评论您的第二次编辑。即 $datetime->createFromFormat('YY-m-d', $date_test);无论我输入什么,我都会得到一个错误。例如,如果您不这么认为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-28
  • 2018-01-18
  • 1970-01-01
  • 2016-02-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多