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
相关产品推荐
相关产品推荐

