日期之差,日期是准确的,转换为 ?年?月?日 和 月份和闰年平年相关。
以下:输入两个日期,用大的减小的。
测试用例测试了一下:
闰年
借位
各个月的差
代码如下:
//两个日期的比较,计算出差 ?年?月?日
var YMD = {
y:0,
m:0,
d:0,
set:function(y,m,d)
{
this.y=y;
this.m=m;
this.d=d;
}
}
function comp_date(x1,x2)
{
if(x1.y==x2.y && x1.m==x2.m && x1.d==x2.d) return 0;
if(x1.y>x2.y) return 1;
if(x1.m>x2.m) return 1;
if(x1.d>x2.d) return 1;
return -1;
}
function get_month(y,m)
{
if(m!=2)
{
if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)
{
return 31;
}
else
{
return 30;
}
}
if(y%400==0)
{
return 29;
}
else if(y%100==0 && y%400!=0)
{
return 28;
}
else if(y%4==0)
{
return 29;
}
return 28;
}
function sub_date(x1,x2)
{
var ret=Object.create(YMD);
//产生借位的情况如何处理
var ds,ms,ys;
var a = comp_date(x1,x2);
if(a==0)
{
//console.log("a==0");
ret.y=0;
ret.m=0;
ret.d=0;
return ret;
}
if(a>0)
{
//console.log("a>0");
return sub_date1(x1,x2);
}
else
{
//console.log("a<0");
return sub_date1(x2,x1,ret);
}
}
function sub_date1(x1,x2)
{
var ret = Object.create(YMD);
//在月上借位
var bm=0;
//在年上借位
var by=0;
//差的天数
var ds;
//月数
var ms;
//年数
var ys;
//
if(x1.d < x2.d)
{
//日期小,在月上借位
bm=1;
//月上借位,看看是否可借,不可借位,则在年上借位
if(x1.m-x2.m-1<0)
{
by=1;
}
}
else
{
bm=0;
if(x1.m<x2.m)
{
by=1;
}
}
//处理借位
if(bm==1)
{
//月上面有借位,则借前一个月的天数过来
ds=x1.d+get_month(x1.y,x1.m-1>0?(x1.m-1):12)-x2.d;
}
else
{
ds=x1.d-x2.d;
}
//年借位
if(by==1)
{
//月借位
if(bm==1)
ms=x1.m-x2.m-1+12;
else
ms=x1.m-x2.m+12;
ys=x1.y-x2.y-1;
}
else
{
//月借位
if(bm==1)
ms=x1.m-x2.m-1;
else
ms=x1.m-x2.m;
ys=x1.y-x2.y;
}
ret.y=ys;
ret.m=ms;
ret.d=ds;
return ret;
}
function check_ret(ymd,y,m,d)
{
var t=Object.create(YMD);
t.y=y;
t.m=m;
t.d=d;
if(comp_date(ymd,t)==0)
{
console.log("OK");
}
else
{
console.log("FAILED");
}
}
function main()
{
var a1=Object.create(YMD);
a1.set(2017,8,10);
var a2=Object.create(YMD);
a2.set(2000,9,3);
var ret;
ret=sub_date(a1,a2);
check_ret(ret,16,11,7);
a1.set(2017,3,1);
a2.set(2017,2,28);
ret=sub_date(a1,a2);
check_ret(ret,0,0,1);
a1.set(2016,3,1);
a2.set(2016,2,28);
ret=sub_date(a1,a2);
check_ret(ret,0,0,2);
a1.set(2000,3,1);
a2.set(2000,2,28);
ret=sub_date(a1,a2);
check_ret(ret,0,0,2);
a1.set(1900,3,1);
a2.set(1900,2,28);
ret=sub_date(a1,a2);
check_ret(ret,0,0,1);
a1.set(2017,12,1);
a2.set(2017,11,30);
ret=sub_date(a1,a2);
check_ret(ret,0,0,1);
a1.set(2017,11,1);
a2.set(2017,10,30);
ret=sub_date(a1,a2);
check_ret(ret,0,0,2);
a1.set(2017,10,1);
a2.set(2017,9,30);
ret=sub_date(a1,a2);
check_ret(ret,0,0,1);
a1.set(2017,9,1);
a2.set(2017,8,30);
ret=sub_date(a1,a2);
check_ret(ret,0,0,2);
a1.set(2017,8,1);
a2.set(2017,7,30);
ret=sub_date(a1,a2);
check_ret(ret,0,0,2);
a1.set(2017,7,1);
a2.set(2017,6,30);
ret=sub_date(a1,a2);
check_ret(ret,0,0,1);
a1.set(2017,6,1);
a2.set(2017,5,30);
ret=sub_date(a1,a2);
check_ret(ret,0,0,2);
a1.set(2017,5,1);
a2.set(2017,4,30);
ret=sub_date(a1,a2);
check_ret(ret,0,0,1);
a1.set(2017,4,1);
a2.set(2017,3,30);
ret=sub_date(a1,a2);
check_ret(ret,0,0,2);
a1.set(2017,3,1);
a2.set(2017,2,25);
ret=sub_date(a1,a2);
check_ret(ret,0,0,4);
a1.set(2017,2,1);
a2.set(2017,1,30);
ret=sub_date(a1,a2);
check_ret(ret,0,0,2);
a1.set(2016,1,1);
a2.set(2015,12,30);
ret=sub_date(a1,a2);
check_ret(ret,0,0,2);
a1.set(2016,1,1);
a2.set(2015,10,5);
ret=sub_date(a1,a2);
check_ret(ret,0,2,27);
a1.set(2000,1,1);
a2.set(1999,12,3);
ret = sub_date(a1,a2);
check_ret(ret,0,0,29);
console.log(ret.y,ret.m,ret.d);
将日期转换成时间戳形式,计算出两时间戳之差,转换回String格式,提取年月日 减去 1970/1/1 8:0:0 (时间戳为0时的初始时间)不计算小时忽略就行
得到的即使日期差
下面是完整的计算两个日期相差的年 月 日 周 天。日期还是先排好序,用大减小,最后值为正值。
<html>
<body>
hello
<script type="text/javascript">
//两个日期的比较,计算出差 ?年?月?日
var YMD = {
y:0,
m:0,
d:0,
set:function(y,m,d)
{
this.y=y;
this.m=m;
this.d=d;
}
}
var YMWD = {
y:0, //year
m:0, //month
w:0, //week
d:0, //day
set:function(y , m , w ,d)
{
this.y=y;
this.m=m;
this.w=w;
this.d=d;
}
}
function comp_date(x1,x2)
{
if(x1.y==x2.y && x1.m==x2.m && x1.d==x2.d) return 0;
if(x1.y>x2.y) return 1;
if(x1.m>x2.m) return 1;
if(x1.d>x2.d) return 1;
return -1;
}
function get_month(y,m)
{
if(m!=2)
{
if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)
{
return 31;
}
else
{
return 30;
}
}
if(y%400==0)
{
return 29;
}
else if(y%100==0 && y%400!=0)
{
return 28;
}
else if(y%4==0)
{
return 29;
}
return 28;
}
function sub_date(x1,x2)
{
var ret=Object.create(YMWD);
//产生借位的情况如何处理
var ds,ms,ys;
var a = comp_date(x1,x2);
if(a==0)
{
//console.log("a==0");
return ret;
}
if(a>0)
{
//console.log("a>0");
return sub_date1(x1,x2);
}
else
{
//console.log("a<0");
return sub_date1(x2,x1,ret);
}
}
function sub_date1(x1,x2)
{
var ret = Object.create(YMWD);
//在月上借位
var bm=0;
//在年上借位
var by=0;
//差的天数
var ds;
//月数
var ms;
//年数
var ys;
//
if(x1.d < x2.d)
{
//日期小,在月上借位
bm=1;
//月上借位,看看是否可借,不可借位,则在年上借位
if(x1.m-x2.m-1<0)
{
by=1;
}
}
else
{
bm=0;
if(x1.m<x2.m)
{
by=1;
}
}
//处理借位
if(bm==1)
{
//月上面有借位,则借前一个月的天数过来
ds=x1.d+get_month(x1.y,x1.m-1>0?(x1.m-1):12)-x2.d;
}
else
{
ds=x1.d-x2.d;
}
//年借位
if(by==1)
{
//月借位
if(bm==1)
ms=x1.m-x2.m-1+12;
else
ms=x1.m-x2.m+12;
ys=x1.y-x2.y-1;
}
else
{
//月借位
if(bm==1)
ms=x1.m-x2.m-1;
else
ms=x1.m-x2.m;
ys=x1.y-x2.y;
}
ret.y=ys;
ret.m=ms;
ret.d=ds%7;
if(ret.d==0)
{
ret.w=ds/7;
}
else
{
ret.w=Math.ceil(ds/7)-1;
}
return ret;
}
function check_ret(ymwd,y,m,w,d)
{
var t=Object.create(YMD);
t.set(y,m,d+w*7);
var src=Object.create(YMD);
src.set(ymwd.y,ymwd.m,ymwd.d+ymwd.w*7);
if(comp_date(src,t)==0)
{
console.log("OK");
}
else
{
console.log("FAILED");
}
}
function main()
{
var a1=Object.create(YMD);
a1.set(2017,8,10);
var a2=Object.create(YMD);
a2.set(2000,9,3);
var ret;
ret=sub_date(a1,a2);
check_ret(ret,16,11,1,0);
a1.set(2017,3,1);
a2.set(2017,2,28);
ret=sub_date(a1,a2);
check_ret(ret,0,0,0,1);
a1.set(2016,3,1);
a2.set(2016,2,28);
ret=sub_date(a1,a2);
check_ret(ret,0,0,0,2);
a1.set(2000,3,1);
a2.set(2000,2,28);
ret=sub_date(a1,a2);
check_ret(ret,0,0,0,2);
a1.set(1900,3,1);
a2.set(1900,2,28);
ret=sub_date(a1,a2);
check_ret(ret,0,0,0,1);
a1.set(2017,12,1);
a2.set(2017,11,30);
ret=sub_date(a1,a2);
check_ret(ret,0,0,0,1);
a1.set(2017,11,1);
a2.set(2017,10,30);
ret=sub_date(a1,a2);
check_ret(ret,0,0,0,2);
a1.set(2017,10,1);
a2.set(2017,9,30);
ret=sub_date(a1,a2);
check_ret(ret,0,0,0,1);
a1.set(2017,9,1);
a2.set(2017,8,30);
ret=sub_date(a1,a2);
check_ret(ret,0,0,0,2);
a1.set(2017,8,1);
a2.set(2017,7,30);
ret=sub_date(a1,a2);
check_ret(ret,0,0,0,2);
a1.set(2017,7,1);
a2.set(2017,6,30);
ret=sub_date(a1,a2);
check_ret(ret,0,0,0,1);
a1.set(2017,6,1);
a2.set(2017,5,30);
ret=sub_date(a1,a2);
check_ret(ret,0,0,0,2);
a1.set(2017,5,1);
a2.set(2017,4,30);
ret=sub_date(a1,a2);
check_ret(ret,0,0,0,1);
a1.set(2017,4,1);
a2.set(2017,3,30);
ret=sub_date(a1,a2);
check_ret(ret,0,0,0,2);
a1.set(2017,3,1);
a2.set(2017,2,25);
ret=sub_date(a1,a2);
check_ret(ret,0,0,0,4);
a1.set(2017,2,1);
a2.set(2017,1,30);
ret=sub_date(a1,a2);
check_ret(ret,0,0,0,2);
a1.set(2016,1,1);
a2.set(2015,12,30);
ret=sub_date(a1,a2);
check_ret(ret,0,0,0,2);
a1.set(2016,1,1);
a2.set(2015,10,5);
ret=sub_date(a1,a2);
check_ret(ret,0,2,3,6);
a1.set(2000,1,1);
a2.set(1999,12,3);
ret = sub_date(a1,a2);
check_ret(ret,0,0,4,1);
a1.set(2016,5,20);
a2.set(2027,8,28);
ret = sub_date(a1,a2);
check_ret(ret,11,3,1,1);
console.log(ret.y,ret.m,ret.d);
}
main();
</script>
</body>
</html>
用moment 几行代码就解决了,很强大的日期处理库http://momentjs.cn