12

以下代码用于在日志中打印时间:

#define PRINTTIME() struct tm  * tmptime;
time_t     tmpGetTime;
time(&tmpGetTime);
tmptime = localtime(&tmpGetTime);
cout << tmptime->tm_mday << "/" <<tmptime->tm_mon+1 << "/" << 1900+tmptime->tm_year << " " << tmptime->tm_hour << ":" << tmptime->tm_min << ":" << tmptime->tm_sec<<">>";

有没有办法为此添加毫秒?

4

7 回答 7

22

要获得毫秒精度,您必须使用特定于您的操作系统的系统调用。

在 Linux 中,您可以使用

#include <sys/time.h>

timeval tv;
gettimeofday(&tv, 0);
// then convert struct tv to your needed ms precision

timeval具有微秒精度。

在 Windows 中,您可以使用:

#include <Windows.h>

SYSTEMTIME st;
GetSystemTime(&st);
// then convert st to your precision needs

当然,您可以使用Boost为您做到这一点:)

于 2009-07-13T16:35:42.450 回答
16

// C++11 风格:

cout << "Time in Milliseconds =" << 
 chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now().time_since_epoch()).count() 
 << std::endl;

cout << "Time in MicroSeconds=" << 
 chrono::duration_cast<chrono::microseconds>(chrono::steady_clock::now().time_since_epoch()).count() 
 << std::endl;
于 2015-01-02T09:22:17.747 回答
4

您需要一个具有更高分辨率的计时器才能捕获毫秒。试试这个:

int cloc = clock();
//do something that takes a few milliseconds
cout << (clock() - cloc) << endl;

这当然取决于您的操作系统。

于 2009-07-13T16:20:37.113 回答
2

高分辨率计时器通常是 Linux 风格平台上的 gettimeofday 和 Windows 上的 QueryPerformanceCounter。

您应该知道,对单个操作的持续时间进行计时(即使使用高分辨率计时器)不会产生准确的结果。有太多的随机因素在起作用。要获得可靠的计时信息,您应该循环运行要计时的任务并计算平均任务时间。对于这种类型的时序,clock() 函数应该足够了。

于 2009-07-13T16:34:53.120 回答
2

如果您不想使用任何特定于操作系统的代码,您可以使用ACE_OS::gettimeofday为大多数标准操作系统提供功能的 ACE 包。例如:

ACE_Time_Value startTime = ACE_OS::gettimeofday();

do_something();

ACE_Time_Value endTime = ACE_OS::gettimeofday();

cout << "Elapsed time: " << (endTime.sec() - startTime.sec()) << " seconds and " << double(endTime.usec() - startTime.usec()) / 1000 << " milliseconds." << endl;

无论您的操作系统如何(只要 ACE 支持此操作系统),此代码都可以使用。

于 2009-09-07T07:56:38.187 回答
1

在 Ubuntu 16.04 中,这对我有用...

const std::string currentDateTime() {
   char            fmt[64], buf[64];
   struct timeval  tv;
   struct tm       *tm;

   gettimeofday(&tv, NULL);
   tm = localtime(&tv.tv_sec);
   strftime(fmt, sizeof fmt, "%Y-%m-%d %H:%M:%S.%%06u", tm);
   snprintf(buf, sizeof buf, fmt, tv.tv_usec);
   return buf;
}

然后,与...

std::cout << currentDateTime();

我得到...

2016-12-29 11:09:55.331008
于 2016-12-29T14:14:30.637 回答
1

使用 C++11 或 C++14 和这个免费的开源库对旧问题的新答案:

#include "tz.h"
#include <iostream>

int
main()
{
    using namespace date;
    using namespace std;
    using namespace std::chrono;
    auto now = make_zoned(current_zone(), floor<milliseconds>(system_clock::now()));
    cout << format("%e/%m/%Y %T", now) << '\n';
}

这只是为我输出:

16/01/2017 15:34:32.167

这是我当前的本地日期和时间到毫秒精度。通过消除,floor<milliseconds>()您将自动获得您system_clock所拥有的任何精度。

如果您希望将结果作为 UTC 时间戳而不是本地时间戳,则更容易:

    auto now = floor<milliseconds>(system_clock::now());
    cout << format("%e/%m/%Y %T", now) << '\n';

如果你想要一个 UTC 时间戳并且你对精度或格式不挑剔,你可以:

cout << system_clock::now() << '\n';

这只是为我输出:

2017-01-16 20:42:11.267245
于 2017-01-16T20:44:05.330 回答