Moment.js计算两日期周数偏差问题:结果为何与多数计算器不同?
为什么Moment.js算出的存活周数和部分在线计算器不一样?
先给你吃个定心丸:你的代码计算出来的5218周是准确的,差异的根源在于不同工具对这100年总天数的计算逻辑有区别。
核心问题:闰年的数量统计
从1997-12-08到2097-12-08正好是整整100年,咱们先掰扯清楚这100年到底有多少天:
- 平年每年365天,闰年多1天(2月29日)
- 闰年的规则是:能被4整除的年份就是闰年,但整百年份必须能被400整除才算(比如2000年是整百年,能被400整除,所以是闰年;2100年不在咱们的时间范围内,不用管)
- 数一下这100年里的闰年:从2000年开始,每4年一个,到2096年结束,一共25个闰年,剩下75个是平年
- 总天数 = 75×365 + 25×366 = 36525天
接下来算周数就简单了:
- 36525 ÷ 7 ≈ 5217.857
- 用
Math.ceil()向上取整,自然就是5218周,和你的代码结果完全匹配。
为啥有些计算器显示5214周?
那些给出5214周的工具,基本都是犯了同一个低级错误:完全没考虑闰年。
它们直接用100×365=36500天来计算,36500÷7≈5214.285,向上取整后就得到了5214周——这显然是错的,因为这100年里足足多了25天的闰年天数没算进去。
怎么快速验证谁对谁错?
你可以拿个短时间段测试,比如从2000-01-01到2001-01-01,这一年是闰年,总天数366天,366÷7≈52.285,向上取整应该是53周。如果哪个计算器算这个时间段得出52周,那它肯定没考虑闰年,结果根本不可信。
总结来说:你的代码逻辑没问题,5218周是正确结果;显示5214周的工具,纯粹是闰年统计环节出了错。
内容的提问来源于stack exchange,提问作者mouchin777




