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
相关产品推荐
相关产品推荐

