如何使用moment.js获得年,月和日的2个日期之间的差异

Nic*_*ick 11 javascript momentjs

如何使用moment.js获得年,月和日的2个日期之间的差异?例如之间的差2014年4月5日&2013年2月22日应该被计算为1年,1月和14天.

Mat*_*int 15

Moment.js无法直接处理此场景.它允许您获取两个时刻之间的差异,但结果是经过的持续时间(以毫秒为单位).Moment确实有一个Duration对象,但它将一个月定义为30天的固定单位 - 我们知道并非总是这样.

幸运的是,已经创建了一个名为"Precise Range"的插件,它做了正确的事情.看一下来源,它有类似于torazaburo的答案 - 但它恰当地说明了调整月份的天数.

在项目中包含moment.js和这个插件(readable-range.js)之后,您可以简单地调用它:

var m1 = moment('2/22/2013','M/D/YYYY');
var m2 = moment('4/5/2014','M/D/YYYY');
var diff = moment.preciseDiff(m1, m2);
console.log(diff);
Run Code Online (Sandbox Code Playgroud)

输出为"1年1个月14天"


小智 6

你几乎不需要时刻.

d1 = new Date(2014, 3, 5);                // April 5, 2014
d2 = new Date(2013, 1, 22);               // February 22, 2013
diff = new Date(
    d1.getFullYear()-d2.getFullYear(), 
    d1.getMonth()-d2.getMonth(), 
    d1.getDate()-d2.getDate()
);
Run Code Online (Sandbox Code Playgroud)

这利用了Date构造函数对负值很聪明的事实.例如,如果月数是负数,那么将考虑到这一点并向后走.

console.log(diff.getYear(), "Year(s),", 
    diff.getMonth(), "Month(s), and", 
    diff.getDate(), "Days.");

>> 1 Year(s), 1 Month(s), and 11 Days. 
Run Code Online (Sandbox Code Playgroud)

你的计算是错误的 - 它不是14天,它是2月的剩余6天和4月的前5天,所以它是11天,因为计算机正确计算.

第二次尝试

考虑到@ MattJohnson的评论,这可能会更好:

dy = d1.getYear()  - d2.getYear();
dm = d1.getMonth() - d2.getMonth();
dd = d1.getDate()  - d2.getDate();

if (dd < 0) { dm -= 1; dd += 30; }
if (dm < 0) { dy -= 1; dm += 12; }

console.log(dy, "Year(s),", dm, "Month(s), and", dd, "Days.");
Run Code Online (Sandbox Code Playgroud)

  • 很好地思考重复使用`Date`对象超出范围的能力.但是,他的方法存在一些问题.1)`Date`对象采用本地时区的DST行为,这可能会扭曲某些结果,2)它不能很好地处理整个月.考虑1月1日 - 7月1日.而不是"6个月",它返回"5个月30天".3)即便如此,闰年也不能很好地发挥作用.1月1日 - 3月1日总是返回"1个月和28天",即使是在闰年 - 技术上应该是"1个月和29天". (2认同)