根据输入数据的数量,我有一个可以在几秒或几天内运行的程序。在我的程序结束时,我想打印经过的“时钟墙”时间:如果小于一分钟,则以秒为单位,如果小于一小时,则以分钟和秒为单位,如果是,则以小时-分钟-秒为单位少于 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++
.