Carbon 和 PHP DateTime 将单个字母解析为日期,但不解析多字符字符串

问题描述 投票:0回答:1

在使用 nesbot/carbon 库时,我注意到它接受单个字母作为有效日期,并以映射到相对时间范围的方式解析它们。具体来说,单个字母被解析(不区分大小写)为时间偏移量,范围为相对于当前时间的 -12 小时到 +12 小时。但是,它不接受单个数字作为字符串或字符串中多个字母。

您可以在这里测试:https://play.phpsandbox.io/embed/nesbot/carbon

<?php
    echo "a: ";
    echo Carbon::parse("a")->getTimestamp(); // now -1 hour
    echo "\r\n b: ";
    echo Carbon::parse("b")->getTimestamp(); // now -2 hours
    echo "\r\n c: ";
    echo Carbon::parse("c")->getTimestamp(); // now -3 hours
    echo "\r\n C: ";
    echo Carbon::parse("C")->getTimestamp(); // now -3 hours (case-insensitive)
    echo "\r\n d: ";
    echo Carbon::parse("d")->getTimestamp(); // now -4 hours
    echo "\r\n m: ";
    echo Carbon::parse("m")->getTimestamp(); // now -12 hours
    echo "\r\n n: ";
    echo Carbon::parse("n")->getTimestamp(); // now +1 hour
    echo "\r\n x: ";
    echo Carbon::parse("x")->getTimestamp(); // now +11 hours
    echo "\r\n Y: ";
    echo Carbon::parse("Y")->getTimestamp(); // now +12 hours
    echo "\r\n z: ";
    echo Carbon::parse("z")->getTimestamp(); // now
    echo "\r\n 1: ";
    echo Carbon::parse("1")->getTimestamp(); // error
    echo "\r\n aa: ";
    echo Carbon::parse("aa")->getTimestamp(); // error

错误信息:

Carbon\Exceptions\InvalidFormatException with message 'Could not parse 'aa': Failed to parse time string (aa) at position 0 (a): The timezone could not be found in the database'

我还检查了标准 php DateTime 对象的反应方式,它现在总是返回单个字母的 UTC,但在尝试解析多个单个字母时会抛出错误。

您可以在这里测试:https://onlinephp.io/

<?php
$date = new DateTime('a'); // UTC now
echo $date->format('Y-m-d H:i:s');
echo "\n";
$date = new DateTime('b'); // UTC now
echo $date->format('Y-m-d H:i:s');
echo "\n";
$date = new DateTime('B'); // UTC now
echo $date->format('Y-m-d H:i:s');
echo "\n";
$date = new DateTime('m'); // UTC now
echo $date->format('Y-m-d H:i:s');
echo "\n";
$date = new DateTime('n'); // UTC now
echo $date->format('Y-m-d H:i:s');
echo "\n";
$date = new DateTime('z'); // UTC now
echo $date->format('Y-m-d H:i:s');
echo "\n";
$date = new DateTime('aa'); // error
echo $date->format('Y-m-d H:i:s');
echo "\n";

错误信息:

Fatal error: Uncaught Exception: Failed to parse time string (aa) at position 0 (a): The timezone could not be found in the database in /home/user/scripts/code.php:21

这种行为有点出乎意料,因为人们可能会认为解析单个字母会引发错误。 这是一个错误吗?或者日期时间库这样工作很常见吗?

php date datetime php-carbon
1个回答
0
投票

“aa”值不是解析器日期时间类中内置的伪常量默认值

© www.soinside.com 2019 - 2024. All rights reserved.