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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 16:01:28