繁体   English   中英

"Moment.js 月差"

[英]Moment.js months difference

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

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

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);

我认为这与The Fine Manual 中描述的“特殊处理”有关:

它经过优化以确保具有相同日期的两个月总是相隔一个整数。

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

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

2011 年 2 月 28 日到 2012 年 2 月 28 日应该正好是 1 年。

Moment.js 在处理31 Jan 31 Oct 31 Jan31 Oct 31 Jan 31 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,这也记录在同一页面上)

我走了一条不同的路,试图找出两个月之间的差异

function getAbsoluteMonths(momentDate) {
  var months = Number(momentDate.format("MM"));
  var years = Number(momentDate.format("YYYY"));
  return months + (years * 12);
}

var startMonths = getAbsoluteMonths(start);
var endMonths = getAbsoluteMonths(end);

var monthDifference = endMonths - startMonths;

这对我来说很有意义,因为 moment 正在用 diff 做一些奇怪的事情,我只是决定明确我的结果会是什么。

如果您使用的是 moment 库,则具有两个月之间正确值差异的简单而简单的解决方案

  const monthDifference =  moment(new Date(endDate)).diff(new Date(startDate), 'months', true);

如果要在 endDate 中添加天数

 const monthDifference = moment(new Date(endDate.add(1, 'days'))).diff(new Date(startDate), 'months', true);

试试这个method

function getMonthDifference(startDate, endDate) {
    const increment = startDate.getMonth() === endDate.getMonth() ? 2 : 1;
    const diff = moment(endDate).diff(moment(startDate), 'months', true);
    return Math.ceil(diff) + increment;    // this increment is opitional and totally depends on your need.
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM