Moment.js - 在两年,几个月和几天的生日中获得差异

Ole*_*eit 25 javascript date momentjs

我正在寻找一种方法来使用momentjs来解析两个日期,以显示差异.

我想把它放在格式上:"X年,Y月,Z天".

几年和几个月,库和模运算符的工作很好.但是对于那些日子来说这是另一个故事,因为我不想处理闰年和我自己的所有这些.到目前为止,我脑子里的逻辑是这样的:

var a = moment([2015, 11, 29]);
var b = moment([2007, 06, 27]);

var years = a.diff(b, 'years');
var months = a.diff(b, 'months') % 12;
var days = a.diff(b, 'days');
// Abit stuck here as leap years, and difference in number of days in months. 
// And a.diff(b, 'days') returns total number of days.
return years + '' + months + '' + days;
Run Code Online (Sandbox Code Playgroud)

Jos*_*ier 38

您可以获得多年的差异并将其添加到初始日期; 然后在几个月内得到差异并再次将其添加到初始日期.

通过这样做,您现在可以轻松获得天数差异,并避免使用模数运算符.

这里的例子

var a = moment([2015, 11, 29]);
var b = moment([2007, 06, 27]);

var years = a.diff(b, 'year');
b.add(years, 'years');

var months = a.diff(b, 'months');
b.add(months, 'months');

var days = a.diff(b, 'days');

console.log(years + ' years ' + months + ' months ' + days + ' days');
// 8 years 5 months 2 days
Run Code Online (Sandbox Code Playgroud)

我不知道有更好的,内置的方法来实现这一点,但这种方法似乎运作良好.

  • 这个答案给出了正确的年,月,天`b =时刻([2007,11,29])`.(8年0个月0天)而@Kunal回答给了(8年零0个月1天) (3认同)
  • 谢谢!这正是我想要的:) (2认同)
  • 2 月 29 日加上一年应该返回 2 月 28 日还是 3 月 1 日?5月31日加一个月应该是6月30日还是7月1日? (2认同)

Kun*_*dia 28

Moment.js也有duration对象.一个时刻被定义为单个时间点,而持续时间被定义为基本上你想要的时间长度.

var a = moment([2015, 11, 29]);
var b = moment([2007, 06, 27]);

var diffDuration = moment.duration(a.diff(b));

console.log(diffDuration.years()); // 8 years
console.log(diffDuration.months()); // 5 months
console.log(diffDuration.days()); // 2 days
Run Code Online (Sandbox Code Playgroud)

@Josh建议可能会起作用,但绝对不是在2个时刻计算差异的正确方法.

  • 错误回答'01/01/2013`和'01/01/2016`之间的区别.它给出了'2y 11m 29d`,而Josh的回答给出了'3y`. (4认同)