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

如何使用PHP转换来自JavaScript的日期格式?解决strtotime转换后返回1969年日期的问题

解决JavaScript日期字符串转PHP日期的问题

这个问题我之前也碰到过!核心原因是strtotime()没法正确解析你那个日期字符串里带括号的时区描述部分,它会直接返回false,而date()函数把false当成时间戳0来处理——对应Unix纪元的起始时间是1970-01-01 00:00:00 GMT,你在GMT-3时区的话,这个时间转换成本地时间就是1969年12月31日,所以才会出现这种奇怪的结果。

下面给你两种可行的解决思路:

方法一:清理字符串后用strtotime解析

先把日期字符串里括号及内部的时区名称去掉,剩下的部分strtotime()就能正常识别了:

// 原始的JavaScript日期字符串
$jsDate = 'Thu Mar 04 2021 18:00:00 GMT-0300 (Brasilia Standard Time)';
// 用正则去掉末尾括号及里面的内容
$cleanDate = preg_replace('/\s*\(.*\)$/', '', $jsDate);
// 现在可以正常解析时间戳
$timestamp = strtotime($cleanDate);
// 转换为你需要的格式
$dateISO = date('c', $timestamp);
$dateCustom = date('Y-m-d H:i:s', $timestamp);

echo $dateISO;   // 输出:2021-03-04T18:00:00-03:00
echo $dateCustom;// 输出:2021-03-04 18:00:00

方法二:用DateTime类的自定义格式解析(更可靠)

DateTime类的createFromFormat()方法可以指定精确的匹配格式,不用依赖strtotime()的自动解析,稳定性更高:

$jsDate = 'Thu Mar 04 2021 18:00:00 GMT-0300 (Brasilia Standard Time)';
// 定义匹配的格式,对应字符串的结构
$format = 'D M d Y H:i:s O \(.*\)';
// 创建DateTime对象
$dateObj = DateTime::createFromFormat($format, $jsDate);

if ($dateObj) {
    // 转换为需要的格式
    echo $dateObj->format('Y-m-d H:i:s'); // 输出:2021-03-04 18:00:00
    echo $dateObj->format('c');           // 输出标准ISO格式带时区
} else {
    echo "日期解析失败";
}

这里的格式占位符说明:

  • D:星期的英文缩写(比如Thu)
  • M:月份的英文缩写(比如Mar)
  • d:两位数字的日期(比如04)
  • Y:四位数字的年份(比如2021)
  • H:i:s:24小时制的时分秒
  • O:时区偏移量(比如-0300)
  • \(.*\):匹配括号及内部的任意内容

内容的提问来源于stack exchange,提问作者G4k'

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 12:19:05