我编写了以下代码来将输入日期提前到下一个日历日期。在使用g ++ 4.1.2
编译的虚拟源文件中进行测试时,这很有效然而,当从我公司的模拟器中运行以下代码时(此时我无法获得复杂的细节),它在20021027中断开;即对于20021027以外的日期,它按预期工作,但对于20021027,它返回20021027本身。
请告知可能出现的问题?
int nextday(const int &date, int n=1)
{
struct tm curr_time;
int yyyy = curr_time.tm_year = date/10000-1900;
int mm = curr_time.tm_mon=(date/100)%100-1;
int dd = curr_time.tm_mday=date%100;
curr_time.tm_min=0;
curr_time.tm_sec=0;
curr_time.tm_hour=0;
time_t next = mktime(&curr_time) + 24*60*60*n;
struct tm new_time;
localtime_r(&next,&new_time);
yyyy = 1900 + new_time.tm_year;
mm = 1 + new_time.tm_mon;
dd = new_time.tm_mday;
return (10000*yyyy+100*mm+dd);
}
答案 0 :(得分:1)
我不明白为什么一个约会会引起问题,但我不知道
理解你为什么要这么做的事情。只需添加一个
在调用tm_mday
之前mktime
字段,然后提取已更正的字段
您传入struct tm
的{{1}}的值。 (这是有原因的
为什么指向mktime
的指针指向非const。)类似于:
mktime
(您可能需要添加一些健全性检查,即验证int
nextday( int date, int n = 1 )
{
tm broken_down;
broken_down.tm_year = date / 10000 - 1900;
broken_down.tm_mon = (date / 100) % 100 - 1;
broken_down.tm_mday = date % 100 + n;
broken_down.tm_hour = 12; // avoid issues with summer time, etc.
broken_down.tm_min = 0;
broken_down.tm_sec = 0;
mktime( &broken_down );
return (broken_down.tm_year + 1900) * 10000
+ (broken_down.tm_mon + 1) * 100
+ broken_down.tm_mday;
}
传入确实代表了预期格式的日期,那
int
处于合理的范围内。或者如果你能影响决定,
使用一些标准的日期格式,所以你不必。)
无论如何,我怀疑模拟器中存在一些问题,特别是如果它在本地使用相同的值。
答案 1 :(得分:0)
你只是达到整数限制2147483647,然后向下舍入。
如果任何数字超过该值,请务必检查您的代码^^。切换到无符号应该修复(或者只是将问题还原到4294967295)
编辑:你是对的。我的回答是错的。