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,提问作者Сергей Соколов
相关产品推荐
相关产品推荐

