如何正确地将日期添加到给定日期

How do i correctly add days to given date?

本文关键字:日期 添加 正确地      更新时间:2023-10-16

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

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

检查

我在这里做错了什么?

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

您有两个错误。

首先,传递给mktime的tm无效:年份不应该像2000那样是绝对年份,而是与1900的年份差,即2000的100。纠正了这个问题后,我得到了2004-02-12(既不是2004-02-13也不是2004-02-10)。

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

第二,在同一结构中,日期可以是1-31,但月份只能是0-11(而不是1-12)。您的2000-01-02是二月二日,而不是一月。

知道了这一点,结果是正确的(我会写全年,但月份从0开始):
1500天添加到2000-01-02:
2000年有366天(闰年),我们不需要1月和2月1日:
 nbsp nbsp;2000-01-02+(366-31-1)天=CCD_11166天加左
另外365天使2002-00-01801天加左
另外365天使2003-00-01436天添加剩余
另外365天使2004-00-01,剩下71天添加
另一个1月31日使2004-01-01,剩余40天添加
闰二月的另一个29日使2004-02-01,11天加左
另外增加11个使2004-02-12

读取http://www.cplusplus.com/reference/ctime/tm/小心

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

根据日期计算天数

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