为什么JS中带T17:00:00.000Z参数的new Date()会返回次日日期?
JavaScript Date对象时区转换逻辑说明
现象背后的核心原理
你观察到的输出差异本质是UTC时间和本地时区的自动转换逻辑:
- 你传入的时间字符串
2015-01-25T17:00:00.000Z末尾的Z是ISO 8601标准的约定,代表该时间是*协调世界时(UTC)*下的时间点 - JavaScript的
Date实例直接打印时,默认会调用toString()方法,将内部存储的UTC时间戳转换为当前运行环境的本地时区格式化输出 - 你得到的输出
Jan 26 2015 00:00:00说明你当前环境的本地时区为UTC+7:UTC时间1月25日17点加7小时,正好是本地时区1月26日0点,和你的观测结果完全吻合。
相关行为的官方规范依据
这一行为完全符合ECMAScript标准的明确规定:
- Date对象内部仅存储自1970-01-01 00:00:00 UTC以来的毫秒级时间戳,本身不保存时区信息
- 解析ISO 8601格式的时间字符串时,如果字符串携带
Z后缀,会直接按UTC时间转换为内部时间戳存储 - 你提到的传入时分秒为00:00:00的时区参数场景,本质是将对应时区的0点时间转换为UTC时间戳存储,当调用
toString()输出本地时间时,就会显示为对应时区的00:00:00,完全符合标准定义的转换规则。
内容的提问来源于stack exchange,提问作者mandaputtra
相关产品推荐
相关产品推荐

