You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 05:05:05