如何在PHP中实现与JavaScript Date.UTC一致的时间转换?
PHP实现与JavaScript Date.UTC一致的时间转换
问题背景
有一个时间数组:
[2023,1,3,17,0,0]
使用JavaScript的Date.UTC可得到正确的UTC时间:
const utcDate1 = new Date(Date.UTC(2023, 1, 3, 17,0,0)); console.log(utcDate1.toUTCString());
输出结果:
"Fri, 03 Feb 2023 17:00:00 GMT"
但使用PHP的mktime转换时,结果月份差了一个月:
echo date("d-m-Y H:i:s", mktime(17,0,0,1,3,2023));
输出结果:
03-01-2023 17:00:00
核心原因
JavaScript的Date.UTC方法中,月份参数是0索引(0代表1月,1代表2月,以此类推);而PHP的mktime/gmmktime中,月份参数是1索引(1代表1月,2代表2月)。这就是两者结果差一个月的根本原因。
解决方法
方法1:调整月份参数,使用UTC专用函数
为避免本地时区干扰,推荐用gmmktime生成UTC时间戳,搭配gmdate按UTC格式输出:
// 将JS风格的0索引月份转为PHP的1索引(数组中的1 → 2) echo gmdate("d-m-Y H:i:s", gmmktime(17, 0, 0, 1 + 1, 3, 2023)); // 输出:03-02-2023 17:00:00
如果直接使用时间数组,可提取元素后统一转换:
$timeArr = [2023, 1, 3, 17, 0, 0]; list($year, $jsMonth, $day, $hour, $min, $sec) = $timeArr; $phpMonth = $jsMonth + 1; // 转换为PHP的1索引月份 echo gmdate("d-m-Y H:i:s", gmmktime($hour, $min, $sec, $phpMonth, $day, $year));
方法2:使用DateTime类(更直观,推荐)
DateTime类支持直接指定UTC时区,代码可读性更高:
$timeArr = [2023, 1, 3, 17, 0, 0]; // 转换JS的0索引月份为PHP的1索引 $date = new DateTime(); $date->setTimezone(new DateTimeZone('UTC')); $date->setDate($timeArr[0], $timeArr[1] + 1, $timeArr[2]); $date->setTime($timeArr[3], $timeArr[4], $timeArr[5]); echo $date->format("d-m-Y H:i:s"); // 输出:03-02-2023 17:00:00
也可以通过构造函数直接传入格式化后的日期字符串:
$timeArr = [2023, 1, 3, 17, 0, 0]; $dateStr = sprintf("%d-%d-%d %d:%d:%d", $timeArr[0], $timeArr[1]+1, $timeArr[2], $timeArr[3], $timeArr[4], $timeArr[5]); $date = new DateTime($dateStr, new DateTimeZone('UTC')); echo $date->format("d-m-Y H:i:s");
内容的提问来源于stack exchange,提问作者joh.De
相关产品推荐
相关产品推荐

