You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:59:58