如何正确地将日期添加到给定日期
How do i correctly add days to given date?
我为存储日期的类制作了这个运算符,它应该将给定的天数添加到日期,并将其转换回人工格式
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-01
801天加左
另外365天使2003-00-01
436天添加剩余
另外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
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 如何在C++中从两个单独的for循环中添加两个数组
- 查询SQLite数据库中的日期
- 如何在 C++20 计时中为日期添加天数?
- 向日期运算符添加天数+
- 使用霍华德·欣南特的日期库将时间信息添加到year_month_day
- 标准::时间 将天数添加到当前日期
- 向C++中的任何日期结构添加一定时间量
- [C++]向抽象日期添加天数的算法,例如,年有13个月,第13个月有40天
- 如何创建任意日期并添加天数-C
- 在C++中添加两个日期
- 如何正确地将日期添加到给定日期
- 日期格式-将日期添加到日期
- 提升日期时间转换和添加秒数
- 在添加或减少天数后提升日期时间返回值
- 将天数添加到日期 C++
- 如何将另一个日期添加到Qt C++中弹出日历中选择的日期
- 如何将日期正确添加到日期中
- 文件在添加日期时不输出
- 添加构建日期(VS 2010 - c++)