JavaScript中将Date对象转为数字计算差值,本质是获取自1970-01-01 UTC起的毫秒时间戳;推荐用.getTime()(语义清晰)或一元加号+(简洁),避免valueOf()、parseInt()等不可靠方式。

JavaScript 中将 Date 对象转为数字进行差值计算,本质是利用其时间戳(毫秒数)特性。最直接、可靠的方式是调用 .getTime() 方法,或使用一元加号 +、Number() 等隐式/显式转换,它们最终都等价于获取自 1970-01-01 00:00:00 UTC 的毫秒数。
用 .getTime() 获取时间戳(推荐)
这是语义最清晰、意图最明确的方式,不依赖隐式转换规则,可读性和维护性高。
-
new Date('2023-01-01').getTime()→1672531200000 - 两个日期相减即得毫秒差:
date2.getTime() - date1.getTime() - 换算成天、小时等只需除以对应毫秒数,例如:差值 ÷ (1000 × 60 × 60 × 24) 得天数(注意取整逻辑)
用一元加号 + 快速转数字
简洁写法,适用于临时计算或链式表达,但需确保操作数确实是 Date 实例(否则可能返回 NaN)。
-
+new Date('2023-01-01')→1672531200000 - 差值计算:
+date2 - +date1,结果仍是毫秒差 - 注意:
+'2023-01-01'是字符串转数字(NaN),而+new Date(...)才触发Date的toPrimitive转换逻辑
避免用 valueOf() 或 parseInt() 等非常规方式
valueOf() 虽然也返回时间戳,但语义模糊(容易误以为是其他类型值);parseInt()、parseFloat() 会先调用 .toString(),得到形如 "Mon Jan 01 2023 00:00:00 GMT+0800" 的字符串,再尝试解析——结果不可靠,大概率是 NaN 或错误数值。
立即学习“Java免费学习笔记(深入)”;
- ❌
parseInt(new Date('2023-01-01'))→NaN - ❌
Number(new Date('2023-01-01').toString())→NaN - ✅ 坚持用
.getTime()或+,不绕路
处理时区与精度注意事项
所有时间戳均为 UTC 毫秒数,不受本地时区影响,因此跨时区比较是安全的。但显示或构造日期时仍需留意时区上下文。
- 差值计算本身无需担心时区,因为
new Date('2023-01-01')和new Date('2023-01-01T00:00:00Z')在 `.getTime()` 后可能不同(前者按本地时区解析) - 建议统一使用 ISO 格式带时区(如
'2023-01-01T00:00:00Z')或明确用new Date(Date.UTC(...))构造 UTC 时间 - 毫秒级精度足够日常使用;若需更高精度(如微秒),需借助
performance.now()等 API,但不适用于日期对象


















