为什么JavaScript Date对象存储UTC时间却显示本地时区时间?
JavaScript Date对象时区转换逻辑解答
- Date对象内部仅存储一个绝对时间戳:即从1970-01-01 00:00:00 UTC开始计算的毫秒数,这个值本身与时区完全无关,不存在修改存储值适配本地时区的逻辑。
- 所谓的「自动转换为本地时区时间」,本质是调用对应方法时的实时计算:
- 调用不带
UTC后缀的日期相关方法(比如getFullYear()、getHours()、toString()等)时,JS引擎会读取宿主系统(运行JS的设备)的时区偏移量,用内部存储的UTC时间戳做偏移计算,得到对应本地时区的时间值后再返回。 - 调用带
UTC后缀的日期相关方法(比如getUTCFullYear()、getUTCHours()、toISOString()等)时,引擎不会做任何时区偏移计算,直接基于原始UTC时间戳返回对应UTC时间的结果。
- 调用不带
举个直观示例:假设当前设备处于东八区(UTC+8),执行代码const date = new Date(0):
- 内部存储的时间戳永远是
0,对应UTC时间为1970-01-01 00:00:00 - 调用
date.getHours()返回8:引擎自动叠加了东八区的8小时偏移得到本地时间 - 调用
date.getUTCHours()返回0:直接读取UTC时间的小时数,无偏移计算
简单总结:Date对象的内部存储值永远是UTC对应的绝对时间戳,所有本地时区的时间结果都是调用对应方法时实时计算得到的,不会修改底层存储的原始值。
内容的提问来源于stack exchange,提问作者Akhlesh Kumar
相关产品推荐
相关产品推荐

