【发布时间】:2012-04-09 20:38:29
【问题描述】:
根据输入数据的数量,我有一个可以在几秒或几天内运行的程序。在我的程序结束时,我想打印经过的“时钟墙”时间:如果小于一分钟,则以秒为单位,如果小于一小时,则以分钟和秒为单位,如果是,则以小时-分钟-秒为单位少于 1 天,否则以天-时-分-秒为单位。这是我正在使用的代码:
#include <cstdio>
#include <ctime>
#include <unistd.h> // for sleep
int main (int argc, char ** argv)
{
time_t startRawTime, endRawTime;
time (&startRawTime);
printf ("%s", ctime (&startRawTime));
sleep (3); // any preprocessing of input data
time (&endRawTime);
printf ("%s", ctime (&endRawTime));
printf ("%.0fs\n", difftime (endRawTime, startRawTime));
time_t elapsed = static_cast<time_t>(difftime (endRawTime, startRawTime));
struct tm * ptm = gmtime (&elapsed);
printf ("%id %ih %im %is\n", ptm->tm_mday, ptm->tm_hour, ptm->tm_min, ptm->tm_sec);
return 0;
}
这是打印的内容:
Mon Apr 9 14:43:16 2012
Mon Apr 9 14:43:19 2012
3s
1d 0h 0m 3s
当然最后一行是错误的(应该是“0d”)。似乎可以通过打印ptm->tm_mday - 1 轻松解决。但是,当两个日期之间确实经过了一天时,ptm->tm_mday 也将是“1”。所以在这种情况下,我不想让它显示为“0d”。
那么有没有办法正确处理这个问题?还是应该将difftime 的结果作为双精度数(即秒数),然后计算自己的秒/分/小时/天数?
备注:我的代码只用在Linux上,用gcc -lstdc++编译。
【问题讨论】:
-
"compiled with gcc -lstdc++" -- 为什么不使用
g++呢?它负责确定用于编译 C++ 代码的选项。 -
这真是滥用时间库。例如,一个 tm 结构代表一个特定的日期,其中 tm_mday 是一个月中的某天,而不是天数。
<chrono>是一个类型安全的时间库,可以防止你犯这种错误。