嗨,我似乎无法让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)
| 归档时间: |
|
| 查看次数: |
8380 次 |
| 最近记录: |