如何用纯数学方法在JavaScript中计算yyyymmdd格式整数日期的天数差
JavaScript纯数学计算yyyymmdd整数日期天数差方案
要求:不调用任何内置日期处理函数,仅用数学运算实现
核心思路
将两个输入的yyyymmdd格式整数统一转换为「从公元元年到该日期的总天数」,两个总天数取绝对值差值就是最终间隔天数,全程无日期API调用。
分步实现逻辑
- 第一步:拆解日期整数得到年、月、日三个数值
对任意日期整数dateInt,可通过取整、取模运算拆分:const year = Math.floor(dateInt / 10000) const month = Math.floor((dateInt % 10000) / 100) const day = dateInt % 100 - 第二步:实现闰年判断逻辑
闰年规则:能被4整除但不能被100整除,或能被400整除的年份为闰年,闰年2月多1天:function isLeapYear(y) { return (y % 4 === 0 && y % 100 !== 0) || (y % 400 === 0) } - 第三步:实现单个日期转总天数的辅助函数
总天数 = 所有完整年份贡献的天数 + 当前年所有完整月份贡献的天数 + 当前月已过天数
这里用小技巧简化闰年判断:如果当前月份小于3,把年份减1,不需要单独判断当前年的闰年是否需要加1天:function dateToTotalDays(dateInt) { let y = Math.floor(dateInt / 10000) let m = Math.floor((dateInt % 10000) / 100) const d = dateInt % 100 // 月份小于3时,当年的闰年影响还没生效,年份减1统一计算 if (m < 3) { y-- } // 平年每月天数数组,索引从0对应1月 const monthDays = [31,28,31,30,31,30,31,31,30,31,30,31] // 计算完整年份贡献的天数:每年365天 + 所有闰年多出来的1天 let total = y * 365 + Math.floor(y/4) - Math.floor(y/100) + Math.floor(y/400) // 加上当前年完整月份的天数 for (let i = 0; i < m - 1; i++) { total += monthDays[i] } // 如果月份大于2且是闰年,加1天 if (m > 2 && isLeapYear(y + 1)) { total += 1 } // 加上当前日的天数 total += d return total } - 第四步:计算两个日期的差值
两个总天数相减取绝对值就是间隔天数:function getDateDiff(date1, date2) { const days1 = dateToTotalDays(date1) const days2 = dateToTotalDays(date2) return Math.abs(days1 - days2) }
测试验证
用你给出的示例测试:
console.log(getDateDiff(20210206, 20210825)) // 输出200,符合预期
内容的提问来源于stack exchange,提问作者Michael Orr
相关产品推荐
相关产品推荐

