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

PHP解析俄语区域格式日期字符串为Y-m-d格式问题

解析俄语格式日期为Y-m-d的解决方法

你之前使用IntlDateFormatter::SHORT预设格式失败,是因为该格式并不匹配“4 мар. 2023 г.”这种带月份缩写点和“г.”后缀的自定义格式。以下是两种可行的解决方法:

方法一:自定义IntlDateFormatter解析模式

先移除日期末尾的“г.”(俄语“年”的缩写,不属于标准日期结构),再指定匹配输入格式的自定义模式:

$dta = "4 мар. 2023 г.";
// 移除末尾的" г."(注意前面的非断空格)
$cleanDate = preg_replace('/\sг\.$/', '', $dta);
// 创建带自定义模式的格式化器
$formatter = new IntlDateFormatter(
    "ru_RU",
    IntlDateFormatter::NONE,
    IntlDateFormatter::NONE,
    date_default_timezone_get(),
    IntlDateFormatter::GREGORIAN,
    "d MMM. yyyy" // 匹配"4 мар. 2023"的格式
);
$unixtime = $formatter->parse($cleanDate);
if ($unixtime !== false) {
    echo date('Y-m-d', $unixtime);
} else {
    echo "日期解析失败";
}

方法二:手动映射俄语月份缩写

如果IntlDateFormatter仍有兼容问题,可以直接通过手动映射月份缩写来重组日期:

$dta = "4 мар. 2023 г.";
// 拆分日期各部分
$parts = explode(' ', $dta);
// 俄语月份缩写到数字的映射(注意部分月份可能不带点,比如五月"май")
$monthMap = [
    'янв.' => '01',
    'фев.' => '02',
    'мар.' => '03',
    'апр.' => '04',
    'май' => '05',
    'июн.' => '06',
    'июл.' => '07',
    'авг.' => '08',
    'сен.' => '09',
    'окт.' => '10',
    'ноя.' => '11',
    'дек.' => '12'
];
// 处理日、月、年
$day = str_pad($parts[0], 2, '0', STR_PAD_LEFT);
$month = $monthMap[$parts[1]] ?? '';
$year = trim($parts[2], 'г.'); // 移除"г."后缀
if (!empty($day) && !empty($month) && !empty($year)) {
    echo "$year-$month-$day";
} else {
    echo "日期解析失败";
}

内容的提问来源于stack exchange,提问作者Сергей Соколов

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 00:45:18