我知道此问题之前被多次询问过,但建议的解决方案总是类似
var diff = date1 - date2;
我的问题是我希望在几年,几个月,一天,......,秒之间得到改变。
例如5y 3m 39d 12h 39i 32s
但仅仅区分差异对我来说太不准确了。
所以我不能假设每个月都有30.4375*24*60*60*1000
毫秒。
我需要完全差异!
因此,如果date1
是2月1日,而date2
是3月1日,它应该显示1米而不是28天(或闰年29天)!
谢谢。
答案 0 :(得分:1)
您可以使用moment.js来实现此目的:(MomentJS Doc)
var start = moment(date1);
var end = moment(date2);
var diff = end.diff(start)
如果你想要特殊的事情,比如几天的差异,你可以这样做:
var diff = end.diff(start, 'days')
答案 1 :(得分:1)
首先,您需要找出哪个日期更大,减去日期,以及它们是否从较大的数字(与基本的多位数减法相似)为负借用。
function DateDiff(a,b){
if(b>a){ // We want a-b to be positive
var c=b;
b=a;
a=c;
}
var s=a.getSeconds()-b.getSeconds();
var mi=a.getMinutes()-b.getMinutes();
var h=a.getHours()-b.getHours();
var d=a.getDate()-b.getDate(); // Subtract days
var m=a.getMonth()-b.getMonth(); // Subtract months
var y=a.getYear()-b.getYear(); // Subtract years
if(s<0){
mi--;
s+=60;
}
if(mi<0){
h--;
mi+=60;
}
if(h<0){
d--;
h+=24;
}
if(d<0){ // Need to borrow from months
m--;
d+=new Date(1900+b.getYear(),1+b.getMonth(),0).getDate();
}if(m<0){ // Need to borrow from years
y--;
m+=12;
}
return [y,m,d,h,mi,s];
}
console.log('Mar 1 - Feb 2 (Leap Year):', DateDiff(new Date(2016,1,2),new Date(2016,2,1)));
console.log('Mar 1 - Feb 2 (Reg Year): ',DateDiff(new Date(2015,1,2),new Date(2015,2,1)));
console.log('Feb 1, 2017 - Feb 2, 2016: ',DateDiff(new Date(2017,1,1),new Date(2016,1,2)));
console.log('5:00 - 4:59: ', DateDiff(new Date(2015,7,1,17), new Date(2015,7,1,16,59)));
答案 2 :(得分:0)
对于您所描述的内容,您需要将年/月/日保存在三个不同的变量中并使用
直接比较年份 var yeardiff = date1.GetFullYear() - date2.GetFullYear();
var monthdiff = date1.GetMonth() - date2.GetMonth();
var daydiff = date1.GetDate() - date2.GetDate();
但是,您将不得不在此进行大量检查。例如,2012年8月2日 - 2012年7月20日将为您提供1个月和-18天,然后您必须根据7月份的天数将其转换为天数。由于这些问题,OP中的其他转换实际上更容易。
答案 3 :(得分:-1)
不使用任何你可以做的库
speed.on('scroll', callback(event))
function mydiff(aa,bb){var a,b;
if(aa<bb) a=aa,b=bb;
else a=bb,b=aa;
var am=a.getMonth(),ay=a.getFullYear();
var dd=b.getDate()-a.getDate();
var dm=b.getMonth()-am-(dd<0?1:0);
return b.getFullYear()-ay-(dm<0?1:0)+'y, '
+ ((12+dm)%12)+'m, '
+((dd<0?new Date(ay, am+1, 0).getDate():0)+dd)+'d';
}
包含差异'b减去一个月中的a',这可能是负数。在这种情况下,月差dd
必须减少1,而(负)日差必须增加前一个月dm
的天数。我从here得到了“特定月份的天数”的公式。类似的行动必须与月份和年份差异b
和dm
进行。
一些样本:
dm
最后一个例子表明,这种“计算”有其局限性:与“正常”月份相比,28天不是一个完整的月份。另一方面,与当月2月28日相比, 整整一个月。因此,也可以认为正确的答案应该是mydiff(new Date(2014,1,2),new Date(2014,2,1)) // "0y, 0m, 27d"
mydiff(new Date(2012,1,1),new Date(2012,2,1)) // "0y, 1m, 0d" (leap year)
mydiff(new Date(2012,1,2),new Date(2012,2,1)) // "0y, 0m, 28d" (leap year)
mydiff(new Date(2014,11,31),new Date(2015,0,1)) // "0y, 0m, 1d" (different years)
mydiff(new Date(2012,10,30),new Date(2013,1,28)) // "0y, 2m, 28d" (different years)
。