基本思路如下,以公元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闰)