0

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

2 回答 2

1

我不明白为什么那一次约会会引起问题,但我不明白你为什么要以艰难的方式做事。只需 tm_mday在调用之前向该字段添加一个,然后从您传入的字段mktime中提取更正的值。(指针指向非常量是有原因的。)类似于:struct tmmktimemktime

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 传入的确实代表了预期格式的日期,并且 n在某个合理的范围内。或者如果您可以影响决定,请使用一些标准日期格式,所以您不必。)

无论如何,我怀疑模拟器中存在一些问题,特别是如果它在本地使用相同的值。

于 2012-09-06T10:27:50.793 回答
0

您只需达到 2147483647 的整数限制,然后向下舍入。

如果任何数字超过该值,请务必检查您的代码^^。切换到无符号应该可以解决这个问题(或者只是将问题退回到 4294967295)

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

于 2012-09-06T09:49:56.170 回答