根据俩日期(yyyy-MM-dd)格式获取它们之间的年月日组合结果(js实现)
公司业务需要分层计算,所以做了个工具,本来想偷个懒网上找个可以用的方法,找了一个结果我测试了几个给陷入死循环了,很大的bug,改了半天,人家想法太复杂了,搞不了,所以自己写个,觉得挺有意思的,记录一下。
1 function getYearAndMonthAndDay(stratstr,endstr){ 2 var _time; 3 if(stratstr<endstr){ 4 _time=stratstr; 5 stratstr = endstr; 6 endstr = _time; 7 } 8 var arys= new Array(); 9 arys=stratstr.split('-'); 10 var stratDate=new Date(arys[0],arys[1]-1,arys[2]); 11 12 arys=endstr.split('-'); 13 var endDate=new Date(arys[0],arys[1]-1,arys[2]); 14 15 var syear = stratDate.getFullYear(); 16 var smonth = stratDate.getMonth()+1; 17 var sday = stratDate.getDate(); 18 19 var eyear = endDate.getFullYear(); 20 var emonth = endDate.getMonth()+1; 21 var eday = endDate.getDate(); 22 var day; 23 var month; 24 var year; 25 //先计算天数 26 if(sday>=eday){ 27 day=sday-eday; 28 }else{//假如较大的日期天数上小于小的,就借上个月一整月天数 29 var s1 = new Date(syear,smonth-2,1); //上个月,,,这里感觉是精髓所在,不用自己判断该月是不是1月,
//减一个月会不会让年份发生变化,直接交由js自己封装的方法去做,只关注它减去一个月生成的日期, 上面日写成1是为了防止月天数不固定,写的太大(比如30天)二月份可能会进位, 30 syear = s1.getFullYear();//更新上个月的年月 31 smonth = s1.getMonth()+1; 32 var d1 = getMonthDays(syear,smonth);//上个月天数 33 day = sday+d1-eday; 34 } 35 //比较月 36 if(smonth>=emonth){ 37 month = smonth-emonth; 38 }else{//借一年 39 var s1 = new Date(syear-1,smonth-1,1); //上个月 40 syear = s1.getFullYear();//更新上个月的年月 41 smonth = s1.getMonth()+1; 42 month = smonth+12-emonth; 43 } 44 year = syear-eyear; 45 var rep = new Object(); 46 rep.y = year; 47 rep.m = month; 48 rep.d = day; 49 return rep; 50 }
function getMonthDays(y,m){ var aMonthDays = [0,31,28,31,30,31,30,31,31,30,31,30,31]; if((y%400 == 0) || (y%4==0 && y%100!=0)){ aMonthDays[2] = 29; } return aMonthDays[m]; }
本文来自博客园,作者:升级打怪猴,转载请注明原文链接:https://www.cnblogs.com/soul113/p/10641054.html