使用ctime将给定日期提前到下一个日历日期的问题

时间:2012-09-06 09:29:57

标签: c++ datetime mktime localtime ctime

我编写了以下代码来将输入日期提前到下一个日历日期。在使用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);
}

2 个答案:

答案 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)

编辑:你是对的。我的回答是错的。