根据俩日期(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];
      }
posted @ 2019-04-02 10:29  升级打怪猴  阅读(818)  评论(0编辑  收藏  举报