5条回答 默认 最新
枫舞的季节 2017-08-10 09:50关注日期之差,日期是准确的,转换为 ?年?月?日 和 月份和闰年平年相关。
以下:输入两个日期,用大的减小的。
测试用例测试了一下:
闰年
借位
各个月的差
代码如下://两个日期的比较,计算出差 ?年?月?日 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);本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
