计算两个日期之间所间隔天数的快速算法

时间:2021-03-01 19:37:53

基本思路如下,以公元1年1月1日为起始日期,计算任意一个日期到它的日数是容易计算的,这样,我只要需要计算出两个需要计算的日期到公元1的所差天数就可以了。

 

int getDayCountFromAD1(int nY, int nM, int nD)

{

    const int MONTHDAY[] =

        {0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};

    const int MONTHDAYLEAP[] =

        {0, 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335};

    int nDay = 0;

    nDay += ((nY % 4 ? 0 : (nY % 100 ? 1 : (nY % 400 ? 0 : 1)))

        ? MONTHDAYLEAP[nM] : MONTHDAY[nM]) + nD;

    nDay += --nY * 365 + nY / 4 - nY / 100 + nY / 400;

    return nDay;

}


/* input date format: YYYYMMDD, start and end date should > 20100101 */

/* example: getDayCountBetweenDate(20100710, 20100810) return 31 */

int getDayCountBetweenDate(int nStart, int nEnd)

{

    return getDayCountFromAD1(nEnd / 10000, nEnd % 10000 / 100, nEnd % 100)

        - getDayCountFromAD1(nStart / 10000, nStart % 10000 / 100, nStart % 100);

}

 

调用方法getDayCountBetweenDate(20000101, 20101001) 返回 3926,为2000-01-01 00:00到2010-10-01 00:00天数。

这段代码通过我的简单测试,在2000~2012年之间是正确的,如果需要更高使用范围的朋友可以用MFC那个时间跨度类来从1970年对比测一下。按我的感觉,如果对闰年的计算要求不高的话,在10000年内结果都是正确的。(目前闰年算法为4年一闰,100不闰,400闰)