JavaScript Date Is Lying to You
6 hours ago
- 日期解析不可靠:仅包含日期的 ISO 字符串被解析为 UTC,而其他格式则被解析为本地时间,导致时区偏移。
- 月份从 0 开始索引,且 Date 对象是可变的,导致静默溢出和意外更改。
- 时区和夏令时导致差一错误:getDate() 与 getUTCDate() 可能返回不同的天数,且夏令时天数并非总是 24 小时。
- 算术和持续时间逻辑脆弱:原始毫秒数学假设每天 24 小时,而像“加一个月”这样的日历算术可能表现异常。
- 序列化丢失时区意图:JSON.stringify 输出 UTC ISO 字符串,丢失了原始偏移量或挂钟时间上下文。
- Temporal API 通过提供显式类型(PlainDate、Instant、ZonedDateTime)、不可变操作和清晰的解析规则来解决这些问题。
- 遗留 Date 代码的实用规则:禁止模糊解析,分离瞬间/日历字段,使用 UTC 进行传输,绝不修改共享实例,集中日期数学运算,并在多个时区下测试。
- 新代码采用 Temporal,并将 Date 隔离在适配器后面,以减少生产环境中的错误。