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)