JS Date API计算日期小时差异常问题求助
问题分析与解决方案
嘿,这个问题我太熟悉了——JavaScript里Date对象的月份索引坑可是坑过不少开发者!
问题原因
JavaScript的Date构造函数中,月份参数是从0开始索引的:
- 0 = 1月,1 = 2月,……,4 = 5月,5 = 6月
你写的new Date(2018, 05, 24)实际上创建的是2018年6月24日的日期,而不是你预期的5月24日。结合你的操作时间(2018/05/23 21:35 UTC-4),6月24日和当前时间的差值自然是一个多月,换算成小时就是746左右,完全偏离了你想要的2.4小时结果。
至于你尝试的直接日期运算、valueOf()、Date.now()等方法结果一致,是因为这些方法都是基于错误的日期对象计算时间戳,根源问题没解决,结果当然不会对。
解决方法
有两种可靠的修正方式:
1. 调整月份参数(减1)
把代表5月的月份参数从05改成04,这样就能正确创建2018年5月24日的日期:
// 正确计算5月24日与当前时间的小时差 (new Date(2018, 04, 24).getTime() - new Date().getTime())/(3600*1000)
2. 使用字符串格式创建日期(更直观)
如果你不想记月份索引的规则,可以直接传入符合ISO格式的日期字符串,避免索引混淆。考虑到你的操作时区是UTC-4,建议明确指定时区,防止自动转换带来的偏差:
// 明确指定UTC-4时区的2018年5月24日 (new Date('2018-05-24T00:00:00-04:00').getTime() - new Date().getTime())/(3600*1000)
这样就能得到你预期的约2.4小时的结果啦!
内容的提问来源于stack exchange,提问作者Philippe Hebert
相关产品推荐
相关产品推荐

