主要问题的答案已经出来了,但我遇到了一个关于 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,因为格式是一个动态变量,将在外部更改。
已编辑
我怀疑您遇到了 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()
。