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

如何根据字符串日期与用户语言创建Carbon日期?

问题分析

原代码存在两个核心问题:

  1. 变量名混淆:函数参数是$date,但代码中错误使用未定义的$datetime变量;返回时直接调用字符串$date的isoformat方法,这会直接报错——字符串并非Carbon实例,没有该方法。
  2. 日期解析逻辑错误:Carbon::setLocale()仅用于设置日期显示的语言本地化,无法让Carbon自动识别不同区域的日期解析格式。当传入法语区域的DD/MM/YYYY格式日期时,Carbon默认按MM/DD/YYYY规则解析,导致月份数值无效(比如20作为月份不存在),从而抛出异常。
解决方案

我们需要根据用户的culture值匹配对应的日期解析格式,使用Carbon::createFromFormat()精准解析日期,同时修复变量名错误。

修正后的代码

use Carbon\Carbon;

function createDate(string $dateStr, string $culture)
{
    // 映射区域到对应的日期解析格式
    $formatMap = [
        'en' => 'm/d/Y H:i:s', // 英文区域:MM/DD/YYYY 时分秒
        'fr' => 'd/m/Y H:i:s', // 法语区域:DD/MM/YYYY 时分秒
        // 可扩展其他区域格式,比如德语:'de' => 'd.m.Y H:i:s'
    ];

    // 校验当前区域是否支持
    $cultureLower = strtolower($culture);
    if (!isset($formatMap[$cultureLower])) {
        throw new \InvalidArgumentException("Unsupported culture: {$culture}");
    }

    $format = $formatMap[$cultureLower];
    // 修剪日期字符串前后空格,避免解析失败
    $datetime = Carbon::createFromFormat($format, trim($dateStr));
    
    // 设置显示用的本地化语言
    Carbon::setLocale($cultureLower);
    
    // 返回符合区域习惯的标准日期格式
    return $datetime->isoFormat('L');
}

代码说明

  • 格式映射:通过$formatMap将不同区域与对应的日期解析规则绑定,确保Carbon能正确识别年、月、日的位置。
  • 字符串修剪:用trim()处理输入日期的前后空格,避免因冗余空格导致解析失败。
  • 异常提示:对不支持的区域抛出明确异常,便于快速定位问题。
  • 本地化显示:调用Carbon::setLocale()保证返回的日期字符串符合用户所在区域的阅读习惯(比如法语区域返回20/12/2022,英文区域返回12/20/2022)。

测试示例

// 英文区域测试
echo createDate('12/20/2022 10:20:20 ', 'en'); // 输出:12/20/2022

// 法语区域测试
echo createDate('20/12/2022 10:20:20 ', 'fr'); // 输出:20/12/2022

内容的提问来源于stack exchange,提问作者hassen elguerouel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 02:25:43