如何获取始终为GMT+000的JavaScript Date对象而非本地时区对象?
首先得明确一个关键事实:JavaScript的Date对象本身并不存储时区信息,它本质上是一个从1970-01-01T00:00:00Z(UTC)开始计算的毫秒数(时间戳)。所有时区相关的显示(比如+GMT+200),都是toString()、toLocaleString()这类方法在调用时,根据当前运行环境的本地时区转换生成的。不存在“天生带GMT+000时区的Date对象”,因为对象本身没有时区属性。
针对你的需求,分两种场景给出解决方案:
场景1:库需要的是代表当前UTC时间的时间戳/Date实例
直接使用new Date()即可。因为new Date()生成的实例,其内部存储的时间戳就是当前UTC时间对应的毫秒数。只要库是正确基于时间戳处理Date对象(而非依赖toString的时区显示),传递这个实例就完全符合要求——库拿到的就是当前UTC时间对应的Date。
场景2:库依赖Date的时区相关方法输出(比如解析字符串)
如果库是通过toString()这类方法的输出来识别时区,你可以构造一个基于当前UTC时间的Date实例,同时可以封装方法让它始终输出UTC格式:
方法1:用Date.UTC()构造对应UTC时间的Date
先获取当前UTC的年月日时分秒,再用Date.UTC()生成时间戳,最后创建Date实例:
const now = new Date(); // 获取当前UTC时间的各个字段 const utcYear = now.getUTCFullYear(); const utcMonth = now.getUTCMonth(); const utcDate = now.getUTCDate(); const utcHours = now.getUTCHours(); const utcMinutes = now.getUTCMinutes(); const utcSeconds = now.getUTCSeconds(); // 构造对应UTC时间的Date实例 const utcDateObj = new Date(Date.UTC(utcYear, utcMonth, utcDate, utcHours, utcMinutes, utcSeconds));
这个实例的时间戳和new Date()完全一致,但如果库调用getUTCHours()、getUTCDate()等UTC相关方法,会直接得到当前UTC的时间字段。
方法2:重写Date实例的toString方法(仅修改显示)
如果只是需要让toString()这类方法始终输出UTC格式,可以重写实例的方法,但注意这不会改变Date的内部时间戳,只是修改了显示逻辑:
const utcDate = new Date(); utcDate.toString = function() { return this.toUTCString(); }; utcDate.toLocaleString = function() { return this.toUTCString(); };
这样调用utcDate.toString()时,会直接返回UTC格式的字符串,符合你要的+GMT000显示效果。
纠正一个误区
你之前尝试new Date((new Date()).toUTCString())得到的Date实例,其实内部时间戳和原Date完全一致——显示本地时区只是因为toString()方法默认用本地时区转换,并不是对象本身变成了本地时间。
内容的提问来源于stack exchange,提问作者Anushka Shrestha

