当前位置: 首页 > 知识库问答 >
问题:

moment.js月差

倪棋
2023-03-14

我使用Moment.js已经有一段时间了,它使日期操作变得更加容易,但我有一个失败的具体案例,我不明白为什么。

当计算今天(2013年10月31日)与2014年2月1日之间的差值时,月份差值返回为2,尽管两个日期之间有3个完整的月份和一天。

10月31日至1月31日的差值为3个月零天。

var mStartDate = moment([ periodStartDate.getFullYear(), periodStartDate.getMonth(), periodStartDate.getDate() ]);
var mTermDate = moment([ someDate.getFullYear(), someDate.getMonth(), someDate.getDate() ]);

console.log('periodStartDate: ' + periodStartDate);
console.log('someDate: ' + someDate);

// Years
var yearsDiff = mTermDate.diff(mStartDate, 'years');

// Months
var monthsDiff = mTermDate.diff(mStartDate, 'months', true);

控制台记录以下内容:

periodStartDate: Thu Oct 31 2013 11:13:51 GMT+0000 (GMT)
someDate: Sat Feb 01 2014 11:13:51 GMT+0000 (GMT)
monthsDiff: 2

如果我将true作为不舍入的布尔值传递,则月差为

monthsDiff: 2.983050847457627 

这仅仅是moment.js.diff()中的一个bug吗?我的其他每个测试用例都成功通过。

共有1个答案

申屠亦
2023-03-14

我认为这与本手册中所述的“特殊处理”有关:

对其进行了优化,以确保日期相同的两个月总是相隔一个整数。

所以1月15日到2月15日应该正好是1个月。

2月28日到3月28日应该正好是1个月。

2011年2月28日至2012年2月28日正好是1年。

Moment.js在处理31 Jan31 Oct(具有同一天)时应用此特殊处理:

// 31 Oct 2013 - 1 Feb 2014
> moment([2014, 1, 1]).diff(moment([2013, 9, 31]), 'months', true)
2.983050847457627

// 31 Oct 2013 - 31 Jan 2014
> moment([2014, 0, 31]).diff(moment([2013, 9, 31]), 'months', true)
3

// 31 Oct 2013 - 30 Jan 2014
> moment([2014, 0, 30]).diff(moment([2013, 9, 31]), 'months', true)
2.967741935483871

因此2.98值是正确的,只是第二个示例将结果转换为“日历月份”差异。

(至于向下舍入为2,这也在同一页上记录了)

 类似资料:
  • Moment.js 是一个简单易用的轻量级 JavaScript 日期处理类库,提供了日期格式化、日期解析等功能。它支持在浏览器和 NodeJS 两种环境中运行。此类库能够将给定的任意日期转换成多种不同的格式,具有强大的日期计算功能,同时也内置了能显示多样的日期形式的函数。另外,它也支持多种语言,你可以任意新增一种新的语言包。 示例代码: var now = moment(); //取当前时间no

  • 我在利用这一刻。js以特定的形式显示时间- 上面的代码以下面的格式显示日期和时间 0年0月1天37小时 我需要展示这样的东西 0年0月1天13小时 我已经尝试使用from现在和from https://momentjs.com/docs/#/displaying/from/ 但无法获得输出。我怎样才能做到这一点。

  • 问题内容: 使用Moment.js,我希望获得特定年份的一个月中的所有日期。例如: 有什么建议?我浏览了Moment.js文档,但找不到任何东西。我得到的壁橱是这样的: 但这只会返回一个整数,该整数具有特定月份的总天数,而不是每天的数组。 问题答案: 这是一个可以解决问题的函数(不使用Moment,而仅使用普通JavaScript): 例如: ES2015 +版本: 请注意,与问题中包含的示例输出

  • 我有一条记录,上面写着:。但是,当我执行时,视图会呈现。知道为什么吗?所有日期都会发生这种情况,总是前一天

  • 使用Moment.js我无法将正确的矩对象转换为具有时区的日期对象。我找不到正确的日期。 例子:

  • 问题内容: 我阅读了moment.js的文档,如果您想从当前日期开始增加1个月,请使用此代码 但是现在的问题是,它没有正确正确地添加日期,例如,假设当前日期为2015年10月31日,请在代码中说明 如果您查看当前的日历时间,则该时间应为1个月 谁能给我一些关于如何解决此问题的意见。 谢谢 问题答案: 编辑