PHP strtotime()转换错误:解析XPathDom获取的土耳其日期返回false求助
咱先理清楚问题根源:strtotime() 默认对非英文的日期本地化名称支持不太友好,尤其是土耳其语这种带特殊字符的月份、星期名,它没法直接识别。下面给你两个靠谱的解决办法:
解决方案1:利用DateTime类配合本地化设置
PHP的DateTime系列函数对本地化日期的支持比strtotime更灵活,只要服务器配置了对应的本地化环境就能用:
// 先清理字符串前后的多余空格(原示例字符串有前后空格) $dateStr = trim($value[0]->nodeValue); // 设置土耳其语本地化环境(根据服务器情况选合适的locale值) setlocale(LC_TIME, 'tr_TR.UTF-8', 'tr_TR', 'turkish'); // 定义匹配土耳其语日期的格式:日 月份 年 星期 时分 $format = 'j F Y l H:i'; // 创建DateTime对象并解析日期 $date = DateTime::createFromFormat($format, $dateStr); if ($date !== false) { // 转换为时间戳 $timestamp = $date->getTimestamp(); var_dump($timestamp); // 会输出对应的时间戳 } else { echo '日期解析失败,请检查格式或本地化设置'; }
注意点:
- 要确保你的服务器已经安装了土耳其语的locale包,如果是Linux服务器,可以用
locale -a命令查看是否有tr_TR.UTF-8这类条目,没有的话需要安装对应语言包。 - 格式字符串里的
j代表不带前导零的日期,F是完整月份名称,Y是四位年份,l是完整星期名称,H:i是24小时制的时分,完全匹配你拿到的日期字符串结构。
解决方案2:手动映射本地化名称到英文
如果服务器没法配置locale(比如共享主机),那就手动把土耳其语的月份、星期替换成英文,再用strtotime解析:
// 清理字符串前后空格 $dateStr = trim($value[0]->nodeValue); // 土耳其语→英文的月份映射(注意拼写和特殊字符要完全匹配) $monthMap = [ 'Ocak' => 'January', 'Şubat' => 'February', 'Mart' => 'March', 'Nisan' => 'April', 'Mayıs' => 'May', 'Haziran' => 'June', 'Temmuz' => 'July', 'Ağustos' => 'August', 'Eylül' => 'September', 'Ekim' => 'October', 'Kasım' => 'November', 'Aralık' => 'December' ]; // 土耳其语→英文的星期映射 $weekdayMap = [ 'Pazar' => 'Sunday', 'Pazartesi' => 'Monday', 'Salı' => 'Tuesday', 'Çarşamba' => 'Wednesday', 'Perşembe' => 'Thursday', 'Cuma' => 'Friday', 'Cumartesi' => 'Saturday' ]; // 替换字符串里的本地化名称 $englishDate = str_replace(array_keys($monthMap), array_values($monthMap), $dateStr); $englishDate = str_replace(array_keys($weekdayMap), array_values($weekdayMap), $englishDate); // 现在调用strtotime就没问题了 $timestamp = strtotime($englishDate); if ($timestamp !== false) { var_dump($timestamp); } else { echo '替换后的日期格式仍无法识别,请检查映射是否正确'; }
优势:
这个方案不依赖服务器的locale配置,兼容性更强,而且你能完全控制替换的内容,避免因locale版本差异导致的问题。
内容的提问来源于stack exchange,提问作者Enes Yurtlu
相关产品推荐
相关产品推荐

