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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:10:52