PHP中strtotime返回1970问题排查:多语言动态日期适配(PHP5/7)
嘿,这个问题我之前踩过坑!strtotime对非英文的月份缩写支持特别有限,像土耳其语的Haz这种本地化缩写它根本识别不了,所以才会返回1970年的时间戳——这是它处理无效日期时的默认结果。给你几个在PHP5和7都能用的解决方案:
手动映射替换法(兼容性拉满)
先给你需要支持的语言建立月份缩写的映射表,把非英文缩写替换成strtotime能识别的英文缩写,再进行解析。示例代码:// 定义多语言月份缩写映射(可根据需要扩展更多语言) $monthMap = [ 'en' => ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], 'tr' => ['Oca', 'Şub', 'Mar', 'Nis', 'May', 'Haz', 'Tem', 'Ağu', 'Eyl', 'Eki', 'Kas', 'Ara'] ]; // 假设你的动态日期是土耳其语的 "Haz 15, 2024",当前语言为tr $dateStr = "Haz 15, 2024"; $currentLang = 'tr'; $monthAbbr = 'Haz'; // 找到对应英文月份并替换 $targetMonthIndex = array_search($monthAbbr, $monthMap[$currentLang]); $enMonth = $monthMap['en'][$targetMonthIndex]; $processedDateStr = str_replace($monthAbbr, $enMonth, $dateStr); // 现在strtotime就能正常解析了 $timestamp = strtotime($processedDateStr); echo date('Y-m-d H:i:s', $timestamp); // 输出 2024-06-15 00:00:00这个方法不用依赖任何扩展,PHP5和7都能完美运行,适合所有环境。
用IntlDateFormatter专业处理(优雅首选)
如果你的PHP环境安装了intl扩展(大部分服务器默认都有,PHP5.3+支持),直接用它来解析本地化日期是最优雅的方式,不用手动维护映射表:// 示例土耳其语日期:"15 Haz 2024" $dateStr = "15 Haz 2024"; $locale = 'tr_TR'; // 对应土耳其语的区域设置 // 创建日期格式化器,指定输入格式和语言 $formatter = new IntlDateFormatter( $locale, IntlDateFormatter::NONE, IntlDateFormatter::NONE, date_default_timezone_get(), IntlDateFormatter::GREGORIAN, "d MMM y" // 输入日期的格式,MMM对应月份缩写 ); // 解析得到时间戳 $timestamp = $formatter->parse($dateStr); echo date('Y-m-d H:i:s', $timestamp); // 输出 2024-06-15 00:00:00这个方法支持几乎所有语言的日期格式,扩展性极强,推荐优先使用。
自定义解析+DateTime创建(无扩展备选)
如果不想用intl扩展,也可以手动提取日期的各个部分,映射月份后用DateTime类创建日期:$dateStr = "Haz 15, 2024"; // 用正则提取月份缩写、日期、年份 preg_match('/(\w+) (\d+), (\d+)/', $dateStr, $matches); $monthAbbr = $matches[1]; $day = $matches[2]; $year = $matches[3]; // 土耳其语月份缩写到数字的映射 $trMonthToNum = [ 'Oca' => 1, 'Şub' => 2, 'Mar' => 3, 'Nis' => 4, 'May' => 5, 'Haz' => 6, 'Tem' => 7, 'Ağu' => 8, 'Eyl' => 9, 'Eki' => 10, 'Kas' => 11, 'Ara' => 12 ]; $monthNum = $trMonthToNum[$monthAbbr]; // 创建DateTime对象并获取时间戳 $date = DateTime::createFromFormat('Y-m-d', "$year-$monthNum-$day"); echo $date->getTimestamp(); // 输出正确的时间戳这个方法同样稳定,适合没有intl扩展的老旧环境。
总的来说,strtotime只认英文日期格式,所以非英文的月份必须先转成它能识别的形式,或者用专门的多语言日期处理工具。上面的方案在PHP5和7都能正常工作,你可以根据自己的服务器环境选最适合的~
内容的提问来源于stack exchange,提问作者LearninCode
相关产品推荐
相关产品推荐

