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

图片说明

日期之差,日期是准确的,转换为 ?年?月?日 和 月份和闰年平年相关。
以下:输入两个日期,用大的减小的。
测试用例测试了一下:
闰年
借位
各个月的差
代码如下:

 //两个日期的比较,计算出差 ?年?月?日
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