如何正确添加天数给定日期?

时间:2015-04-04 14:39:24

标签: c++ mfc

我为我存储日期的类创建了这个运算符,它应该添加给定的天数并将其转换回人格式

CDate CDate::operator+(const int x)
{
    time_t t;
    struct tm tmp = {0};
    struct tm newtime = {0};
    tmp.tm_year = timeinfo.tm_year;
    tmp.tm_mon = timeinfo.tm_mon;
    tmp.tm_mday = timeinfo.tm_mday + x;
    t = mktime(&tmp);
    newtime = *(localtime(&t));
    return CDate(newtime.tm_year,newtime.tm_mon,newtime.tm_mday);
}

问题是计算日期应该高出3天

具体的问题是,我有约会2000-01-02(年 - 月 - 日),我尝试增加1500天,预期结果是2004-02-10但我得到了2004-02-13

check

我在这里做错了什么?

我的代码: http://pastebin.com/wLxzTe3W

2 个答案:

答案 0 :(得分:1)

您有两个错误。

首先,传递给mktime的tm无效:年份不应该是2000的绝对年份,而是1900年的年份,即。 100代表2000.更正此问题后,我得到2004-02-12结果(2004-02-132004-02-10)。

(在我的计算机上,程序(没有任何更改)只是崩溃:mktime返回-1,localtime无法处理它并返回一个无效的指针,它在同一行中使用...)

其次,在同一结构中,日期可能是1-31,但只有0-11(不是1-12)。你的2000-01-02是2月的第二天,而不是一月。

知道这一点,结果是正确的(我会写一整年,但从0开始的月份):
将1500天添加到2000-01-02
2000年有366天(闰年),我们不需要1月和2月的第一天:
2000-01-02 +(366-31-1)天= 2001-00-01,向左添加1166天
另外365天进行2002-00-01,向前添加801天左 另外365天进行2003-00-01,将剩余436天添加到左侧 另外365天进行2004-00-01,将71天添加到左侧 1月31日为2004-01-01,向左添加为期40天 2月的另外29次跳跃使2004-02-01,11天加左 另外11个添加了2004-02-12

仔细阅读http://www.cplusplus.com/reference/ctime/tm/

答案 1 :(得分:0)

这是为日期添加天数的算法。

从日期开始计算日期数。

function g(y,m,d)

   m = (m + 9) % 12

   y = y - m/10

   return 365*y + y/4 - y/100 + y/400 + (m*306 + 5)/10 + ( d - 1 )

添加否。日期中的天数 - >

g(y2,m2,d2)+ no_of_days

在此之后,您可以将日期转换回日期。

    function d(g)
y = (10000*g + 14780)/3652425
ddd = g - (365*y + y/4 - y/100 + y/400)
if (ddd < 0) then
 y = y - 1
 ddd = g - (365*y + y/4 - y/100 + y/400)
 endif
mi = (100*ddd + 52)/3060
mm = (mi + 2)%12 + 1
y = y + (mi + 2)/12
dd = ddd - (mi*306 + 5)/10 + 1
return y, mm, dd