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

标签 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,因为格式是一个动态变量,将在外部更改。

已编辑

最佳答案

我怀疑您遇到了 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()

关于c - 从当前时间减去 1 小时(奇怪的行为),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34523059/

相关文章:

c - C 中的嵌套结构访问

linux - 显示 Linux 启动时运行的 bash 脚本中的内容

c - 为什么静态数组工作

ruby-on-rails - 用 yum 安装的 mod_passenger.so 在哪里?

linux - 为什么 SDL 在 Linux (PocketCHIP) 上检测不到我的 iBuffalo 游戏 Controller ?

linux - shell 清理脚本建议

c - 为什么 C 中不允许直接二进制输入/输出?

c - 绘制点之间的中点线

c++ - 确定消息发送到哪个窗口(SetWindowsHookEx & WH_KEYBOARD)

c - 为什么 gcc 数学库效率这么低?