php DateTime createFromFormat功能

Rob*_*_UK 8 php datetime

嗨,我似乎无法让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);
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Jon*_*Jon 48

事情大概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";
}
Run Code Online (Sandbox Code Playgroud)

看到它在行动.

  • 为了使支票准备好进行复制/粘贴,还应该具有初始支票:if(!$ dateTime ||!empty($ errors ['warning_count'])){:) (2认同)