不同时区/设备同一时刻创建的JavaScript Date对象是否完全一致?
问题解答
你的理解完全正确,同一物理时刻在任意时区创建的Date对象本质是完全一致的。
你测试中出现的约8000毫秒差值,是修改系统时区的操作过程消耗的时间,和时区本身没有关联。如果能做到完全同一瞬间在不同时区的设备上执行new Date().getTime(),得到的数值会完全相同。
核心逻辑说明
JavaScript的Date对象内部存储的是自1970年1月1日 00:00:00 UTC(Unix纪元)起的毫秒级时间戳,这个时间戳是和时区完全无关的全球统一值,仅和当前真实物理时间挂钩。
需要注意的相关要点
- 时区仅影响时间的本地化展示:只有调用
toString()、getHours()、getMonth()这类不带UTC前缀的方法时,Date对象才会根据设备当前的本地时区做转换,返回对应时区的时间数值,同一时间戳在不同时区调用这类方法会得到不同结果。如果需要获得不受时区影响的时间值,要调用toUTCString()、getUTCHours()、getUTCMonth()等带UTC前缀的方法。 - 构造指定时间的
Date对象要注意时区规则:如果用new Date(年, 月, 日, 时, 分, 秒)的语法构造时间,传入的时间参数默认会按设备本地时区解析,不同时区的设备构造出来的时间戳会有差异。如果需要按UTC标准解析指定时间,要使用new Date(Date.UTC(年, 月, 日, 时, 分, 秒))的写法。 - 跨时区时间对比不要用本地化时间值:如果要判断两个时间的先后顺序,直接对比两者
getTime()返回的时间戳即可,不要对比getHours()这类本地化时间的数值,否则容易出现跨时区判断错误。 - 序列化
Date对象优先用UTC格式:调用toJSON()方法得到的是UTC时区的ISO时间字符串,不受本地时区影响,适合跨系统传输时间。
内容的提问来源于stack exchange,提问作者vikben
相关产品推荐
相关产品推荐

