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

JavaScript/Node中字典内日期对象时区偏移异常问题

解决Date对象作为对象键时的时区问题

这个问题我之前也踩过坑!核心原因其实很简单:当你把Date对象(或者通过Date()函数调用得到的字符串)当作对象的键时,JavaScript会自动把它转换成字符串——而默认的toString()方法返回的是本地时区的时间字符串,不管你是用UTC方式创建的Date对象还是普通方式。

你看你写的代码里,Date(Date.UTC(2019,8,20, 9, 0))其实是把UTC时间戳直接转成了本地时区的字符串(因为Date()作为函数调用而非构造函数时,会返回当前或指定时间的本地时区字符串)。就算你改成new Date(Date.UTC(...))当键,结果也是一样的,因为对象键会自动调用这个Date对象的toString()方法,还是输出本地时区格式。

给你两个靠谱的解决方案:

方案1:用UTC标准的ISO字符串当键

使用Date对象的toISOString()方法,它会返回UTC时区的ISO格式字符串,完全符合你的需求:

const b = {};
const utcDate = new Date(Date.UTC(2019, 8, 20, 9, 0));
b[utcDate.toISOString()] = true;
// 结果: { '2019-09-20T09:00:00.000Z': true }

方案2:用UTC时间戳当键

Date.UTC()本身返回的就是UTC时间对应的毫秒级时间戳(数字类型),直接用这个数字当键不仅不会有时区问题,还更高效:

const b = {};
const utcTimestamp = Date.UTC(2019, 8, 20, 9, 0);
b[utcTimestamp] = true;
// 结果: { 1568977200000: true }

如果之后需要把键转回Date对象,两种方式都很方便:

  • 用ISO字符串:new Date('2019-09-20T09:00:00.000Z')会直接解析成正确的UTC时间
  • 用时间戳:new Date(1568977200000)同样会得到UTC时间的Date对象

内容的提问来源于stack exchange,提问作者Abdul Aziz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:55:42