如何使用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'
相关产品推荐
相关产品推荐

