从当前时间减去1小时(奇怪的行为)

时间:2015-12-30 04:49:38

标签: c linux

主要问题的答案已经存在,但我面临着strftime的一个奇怪问题。请检查以下代码

int lookback = 60;
time_t ct;
time(&ct);
ct -= (lookback*60);
struct tm *ts = localtime(&ct);

char path[1024];
char format[512] = "/home/stash/%Y%m%d";

printlog("Maximum Lookback time: %02d-%02d-%d %2.2d:%2.2d:%2.2d", ts->tm_mday, ts->tm_mon+1, ts->tm_year+1900, ts->tm_hour, ts->tm_min, ts->tm_sec); // This one works just fine

strftime(path, 1024, format, ts); // But strftime gives me current time

知道我做错了吗?或者还有其他方法可以达到这个目的吗?注意,我需要使用strftime,因为格式是动态var,将在外部更改。

被修改

1 个答案:

答案 0 :(得分:2)

我怀疑您遇到了localtime()返回指向静态存储的指针的问题,因此对localtime()的多次调用最终都指向相同的数据。特别是,这意味着如果您使用两个不同的值调用localtime()两次,然后分析输出,则输出看起来是相同的。

看看你的代码改编:

#include <stdio.h>
#include <time.h>

int main(void)
{
    int lookback = 60;
    time_t c0 = time(0);
    time_t ct = c0 - (lookback*60);
    struct tm *t0 = localtime(&c0);
    //struct tm  copy_t0 = *t0;
    struct tm *ts = localtime(&ct);

    char path[1024];
    char p0[1024];
    char format[512] = "/home/stash/%Y%m%d-%H%M%S";
    strftime(p0, sizeof(p0), format, t0);
    //strftime(p0, sizeof(p0), format, &copy_t0);
    strftime(path, sizeof(path), format, ts); 
    printf("%lu: %s\n", (unsigned long)c0, p0);
    printf("%lu: %s\n", (unsigned long)ct, path);
    return 0;
}

当我运行该代码时,我得到了示例输出:

1451456585: /home/stash/20151229-212305
1451452985: /home/stash/20151229-212305

当我使用注释掉的代码 - 从localtime()复制结构 - 然后我得到了我想要的答案:

1451456732: /home/stash/20151229-222532
1451453132: /home/stash/20151229-212532

显然,处理差异的另一种方法是在下次调用localtime()strftime()之前调用localtime()然后调用strftime()