JavaScript计算两日期天数差的核心是转时间戳相减后除86400000并取整;需处理时区、无效输入、零点对齐等问题,提供基础、日历日、安全校验及ISO手动解析四种方案。

用 JavaScript 计算两个日期之间相差的天数,核心思路是:把两个日期转为时间戳(毫秒数),相减后除以一天的毫秒数(1000 × 60 × 60 × 24),再取整。
基础方法:使用 Date.getTime()
这是最常用、兼容性最好的方式。注意要确保输入是合法的 Date 对象,否则会返回 NaN。
示例代码:
function diffDays(date1, date2) {
const time1 = new Date(date1).getTime();
const time2 = new Date(date2).getTime();
const diffMs = Math.abs(time2 - time1); // 取绝对值,确保结果为正
return Math.floor(diffMs / (1000 * 60 * 60 * 24));
}
<p>// 使用示例
console.log(diffDays('2024-01-01', '2024-01-10')); // 9
console.log(diffDays('2024/03/15', '2024-03-01')); // 14</p>注意日期格式和时区问题
JavaScript 的 Date 构造函数对字符串格式敏感:
立即学习“Java免费学习笔记(深入)”;
-
'2024-01-01'(ISO 格式)会被当作 UTC 时间解析,可能因本地时区产生 1 天偏差; -
'2024/01/01'或'Jan 1, 2024'通常按本地时区解析,更符合日常预期; - 如果需要严格按“日历日”计算(忽略具体时分秒),建议统一设为当天零点:
function diffCalendarDays(date1, date2) {
const d1 = new Date(date1);
const d2 = new Date(date2);
// 清空时分秒,避免跨天误差
d1.setHours(0, 0, 0, 0);
d2.setHours(0, 0, 0, 0);
return Math.floor(Math.abs(d2 - d1) / (1000 * 60 * 60 * 24));
}
处理无效输入和边界情况
实际项目中建议加简单校验,防止 NaN 导致计算失败:
- 检查
Date实例是否有效(isNaN(date.getTime())); - 支持字符串、时间戳、Date 对象等多种输入类型;
- 可选返回负数表示顺序(如 date2 在 date1 之前);
function diffDaysSafe(a, b) {
const d1 = new Date(a);
const d2 = new Date(b);
if (isNaN(d1.getTime()) || isNaN(d2.getTime())) {
throw new Error('Invalid date input');
}
return Math.round((d2 - d1) / (1000 * 60 * 60 * 24)); // 用 round 更合理(含小数时四舍五入)
}
不依赖 Date 构造函数的轻量方案(仅限 ISO 纯日期)
如果确定输入是 'YYYY-MM-DD' 格式,且只需日历差,可手动解析年月日计算,完全避开时区干扰:
function diffDaysISO(dateStr1, dateStr2) {
const [y1, m1, d1] = dateStr1.split('-').map(Number);
const [y2, m2, d2] = dateStr2.split('-').map(Number);
const ms1 = new Date(y1, m1 - 1, d1).getTime();
const ms2 = new Date(y2, m2 - 1, d2).getTime();
return Math.floor(Math.abs(ms2 - ms1) / 86400000);
}


















