c - C中的格式化耗时

标签 c time c99 strftime

我正在编写一个函数,除其他外,它必须打印出耗时计数器。它通过引用接收开始时间 _start,并将其与 current 进行比较,两者的类型均为 time_t。我想使用 strftime() 以 ISO 8601 格式打印出观察到的时间增量。这是我试图做的:

// Negative start time implies program has not begun
if (*_start > 0) {
    time_t elapsed = current - *_start;
    strftime(time_str, sizeof(time_str) - 1, "%T", localtime(&elapsed));
    printf("%s\n", time_str);
}

这是我运行程序后立即得到的输出

01:00:00
01:00:00
01:00:01
01:00:01
01:00:01

秒数工作正常,如果我让它运行得更长,它们会按预期增加,分钟也是如此,但是小时从 01 开始,而不是 00。为什么会这样?我怎样才能让小时开始归零,就像分钟一样?

最佳答案

time_t 通常(参见编辑)存储绝对时间戳(自 1970 年 1 月 1 日午夜 UTC 以来的秒数)。通过计算 current - *_start,您将获得以秒为单位的耗时(根据需要),然后将其传递给 localtimestrftime ,您是在告诉计算机计算自程序启动以来耗时,并将其视为自 UTC 1-1-1970 午夜以来耗时。

我猜这恰好是您系统本地时区的 01:00:00。

我不知道有 C99 函数可以打印耗时,但是自己写一个并不难。

void format_elapsed_time(char *time_str, int total_seconds_elapsed) {
    int hours_elapsed = total_seconds_elapsed / 3600;
    int minutes_elapsed = (total_seconds_elapsed % 3600) / 60;
    int seconds_elapsed = total_seconds_elapsed % 60;
    sprintf(time_str, "%02i:%02i:%02i", hours_elapsed, minutes_elapsed, seconds_elapsed);
}

编辑:正如@chux 指出的那样,time_t 不必将时间戳存储为自 1-1-1970 以来的秒数。参见 this answer了解详情。

关于c - C中的格式化耗时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43107072/

相关文章:

java - 用于向 "HH:MM"字符串添加更多分钟的代码

python - 转换和排序时间戳

c - 数组初始化中的三元运算符

创建使用 getaddrinfo 的静态链接二进制文件?

c - 按位运算和移位

c - 递归函数 int sum(int * x, int n)?

pandas - Pandas 的两个日期时间之间是否存在给定日期和月份的日期?

C99标准措辞的澄清c./变化

c++ - 如何计算文本文件中的所有数字?

c - 如何使用 memcpy 设置字节数?