Carbon与PHP DateTime解析单字母为日期:该行为是Bug还是通用机制?
单个字母在Carbon与PHP DateTime中的解析行为疑问
Carbon库的解析表现
使用nesbot/carbon库时,发现单个字母会被视为有效日期并解析为相对时间范围:
- 单个字母(不区分大小写)会转换为相对于当前时间的时间偏移,范围为-12小时到+12小时
- 字符串形式的单个数字或多字母字符串无法被解析,会抛出错误
测试代码:
<?php echo "a: "; echo Carbon::parse("a")->getTimestamp(); // 当前时间减1小时 echo "\r\n b: "; echo Carbon::parse("b")->getTimestamp(); // 当前时间减2小时 echo "\r\n c: "; echo Carbon::parse("c")->getTimestamp(); // 当前时间减3小时 echo "\r\n C: "; echo Carbon::parse("C")->getTimestamp(); // 当前时间减3小时(不区分大小写) echo "\r\n d: "; echo Carbon::parse("d")->getTimestamp(); // 当前时间减4小时 echo "\r\n m: "; echo Carbon::parse("m")->getTimestamp(); // 当前时间减12小时 echo "\r\n n: "; echo Carbon::parse("n")->getTimestamp(); // 当前时间加1小时 echo "\r\n x: "; echo Carbon::parse("x")->getTimestamp(); // 当前时间加11小时 echo "\r\n Y: "; echo Carbon::parse("Y")->getTimestamp(); // 当前时间加12小时 echo "\r\n z: "; echo Carbon::parse("z")->getTimestamp(); // 当前时间 echo "\r\n 1: "; echo Carbon::parse("1")->getTimestamp(); // 报错 echo "\r\n aa: "; echo Carbon::parse("aa")->getTimestamp(); // 报错
解析多字母字符串时的错误信息: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的解析表现
测试标准PHP DateTime对象时:
- 单个字母始终返回UTC当前时间
- 解析多字母字符串时会抛出错误
测试代码:
<?php $date = new DateTime('a'); // UTC当前时间 echo $date->format('Y-m-d H:i:s'); echo "\n"; $date = new DateTime('b'); // UTC当前时间 echo $date->format('Y-m-d H:i:s'); echo "\n"; $date = new DateTime('B'); // UTC当前时间 echo $date->format('Y-m-d H:i:s'); echo "\n"; $date = new DateTime('m'); // UTC当前时间 echo $date->format('Y-m-d H:i:s'); echo "\n"; $date = new DateTime('n'); // UTC当前时间 echo $date->format('Y-m-d H:i:s'); echo "\n"; $date = new DateTime('z'); // UTC当前时间 echo $date->format('Y-m-d H:i:s'); echo "\n"; $date = new DateTime('aa'); // 报错 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
这种行为有些出乎意料,因为通常会认为解析单个字母应该抛出错误。请问这属于Bug,还是日期库的通用行为?
内容的提问来源于stack exchange,提问作者Unlucky
相关产品推荐
相关产品推荐

