布袋戏偶 2017-08-10 06:23 采纳率: 14.3%
浏览 1622
已采纳

指定日期年月周天计算,求大神解决!如图我已经算出天了不知道怎么算年月周天!

图片说明

  • 写回答

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);
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?