主要问题的答案已经存在,但我面临着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,将在外部更改。
被修改
答案 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, ©_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()
。