使用moment.js计算指定日期与今日天数差返回0的问题排查
问题排查与修复方案
嘿,你的代码始终返回0主要是两个关键问题导致的:
1. 没必要将今日日期转为字符串
你通过moment().format("DD/MM/YYYY")把today转换成了字符串,但moment.diff()的正确用法是对比两个moment对象。虽然moment能自动解析字符串,但这一步不仅多余,还可能埋下解析错误的隐患。
2. 未指定日期解析格式,导致moment识别错误
你的目标日期字符串是"19/04/2018"(日/月/年格式),但moment默认会优先按美式日期(月/日/年)去解析。当它看到19作为月份时,会判定这是一个无效日期——无效日期和任何日期的差值都会是0,这就是你得到结果0的核心原因。
修正后的代码
var stringDate = $scope.dataAddOutpatient.date; // 返回"19/04/2018" // 直接保留moment实例,不要转成字符串 var today = moment(); // 明确指定解析格式,让moment正确识别日/月/年结构 var targetDate = moment(stringDate, "DD/MM/YYYY"); // 计算已过去的天数:过去的日期diff会返回负数,用绝对值处理 var daysPassed = Math.abs(targetDate.diff(today, 'days')); // 如果你更习惯用duration的写法,也可以这样: // var daysPassed = Math.abs(moment.duration(today.diff(targetDate)).asDays());
额外说明
- 用
moment(stringDate, "DD/MM/YYYY")明确指定格式是关键,确保moment不会误解日期结构。 diff(today, 'days')直接返回天数差值,比通过duration.asDays()更简洁高效。- 加上
Math.abs()是因为如果目标日期在今日之前,diff会返回负数,取绝对值后就是实际过去的天数。
内容的提问来源于stack exchange,提问作者Bibi
相关产品推荐
相关产品推荐

