我为我存储日期的类创建了这个运算符,它应该添加给定的天数并将其转换回人格式
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我在这里做错了什么?
答案 0 :(得分:1)
您有两个错误。
首先,传递给mktime的tm
无效:年份不应该是2000
的绝对年份,而是1900年的年份,即。 100
代表2000.更正此问题后,我得到2004-02-12
结果(2004-02-13
和2004-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
答案 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