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

PHP如何从非英语缩写日期格式解析得到标准化日期时间

非英语月份缩写日期解析方案(以意大利语+Carbon为例)

Carbon默认仅内置英文日期格式的解析规则,直接传入意大利语月份缩写会识别失败,注意Carbon::setLocale('it')仅作用于日期输出的多语言转换,不会改变解析逻辑,不要踩这个坑。

针对Sett21这类意大利语紧凑日期格式,有两种可落地的实现方案:

方案1:自定义月份映射替换(最稳妥,无环境依赖)

先把意大利语月份缩写替换为数字月份,再构造Carbon实例,不受服务器locale配置影响,适配你当前的短格式输入场景。
意大利语标准月份缩写和对应数字月份的映射如下:

  • Gen -> 01(Gennaio,1月)
  • Feb -> 02(Febbraio,2月)
  • Mar -> 03(Marzo,3月)
  • Apr -> 04(Aprile,4月)
  • Mag -> 05(Maggio,5月)
  • Giu -> 06(Giugno,6月)
  • Lug -> 07(Luglio,7月)
  • Ago -> 08(Agosto,8月)
  • Sett -> 09(Settembre,9月)
  • Ott -> 10(Ottobre,10月)
  • Nov -> 11(Novembre,11月)
  • Dic -> 12(Dicembre,12月)

参考实现代码:

// 意大利语月份缩写映射表
$itMonthMap = [
    'Gen' => '01',
    'Feb' => '02',
    'Mar' => '03',
    'Apr' => '04',
    'Mag' => '05',
    'Giu' => '06',
    'Lug' => '07',
    'Ago' => '08',
    'Sett' => '09',
    'Ott' => '10',
    'Nov' => '11',
    'Dic' => '12',
];

$input = 'Sett21';
// 拆分输入的月份缩写和两位年份
preg_match('/^([A-Za-z]+)(\d{2})$/', $input, $matches);
[, $monthAbbr, $yearShort] = $matches;
// 补全年份,默认按20xx处理,有跨世纪需求可以自行加判断逻辑
$fullYear = 2000 + (int)$yearShort;
$month = $itMonthMap[$monthAbbr];
// 构造Carbon实例,默认取当月1日
$date = Carbon::create($fullYear, $month, 1);
// 输出01/09/2021格式的标准化日期
echo $date->format('d/m/Y');

方案2:调用多语言解析方法(适合标准格式输入)

Carbon 2及以上版本提供了parseFromLocale方法,可以指定解析语言,但要求服务器安装了对应语言的locale包,且输入格式要符合当地常规日期写法,类似Sett21的紧凑缩写格式识别稳定性差,更适合Settembre 2021这类完整写法的解析:

// 需提前在服务器安装it_IT locale包,否则会解析失败
$date = Carbon::parseFromLocale('Settembre 2021', 'it');
echo $date->format('d/m/Y');

生产环境优先选方案1,没有额外环境依赖,不会因为服务器配置差异出现解析异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 21:24:21