如何在C ++中以毫秒为单位获取当前时间?

时间:2015-09-30 18:57:26

标签: c++ time milliseconds

问题是,我必须以方便的格式以毫秒为单位获取当前时间。

所需输出的示例:

  

21 h 04 min 12 s 512 ms

我知道如何在几秒钟内获得这种格式,但我不知道如何在几毫秒内获得这些格式?

3 个答案:

答案 0 :(得分:7)

使用便携式here

auto now = std::chrono::system_clock::now();
auto time = std::chrono::system_clock::to_time_t(now);
auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()) -
          std::chrono::duration_cast<std::chrono::seconds>(now.time_since_epoch());

std::cout << std::put_time(std::localtime(&time), "%H h %M m %S s ");
std::cout << ms.count() << " ms" << std::endl;

输出:

  

21 h 24 m 22 s 428 ms

std::chrono

对于时钟不支持毫秒分辨率

的系统的注意事项

正如Live example所指出的,在某些系统@user4581301上可能没有足够的分辨率来准确表示当前时间(以毫秒为单位)。如果是这种情况,请尝试使用std::system_clock来计算自上一秒以来的毫秒数。这将确保您的实施提供最高的可用分辨率。

从两个时钟中抽出时间将不可避免地导致你获得两个不同的时间点(不过时差会很小)。所以请记住,使用单独的时钟计算毫秒数不会在第二个和毫秒级之间产生完美的同步。

// Use system clock for time.
auto now = std::chrono::system_clock::now();

/* A small amount of time passes between storing the time points. */

// Use separate high resolution clock for calculating milliseconds.
auto hnow = std::chrono::high_resolution_clock::now();
auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(hnow.time_since_epoch()) -
          std::chrono::duration_cast<std::chrono::seconds>(hnow.time_since_epoch());

此外,似乎无法保证std::high_resolution_clockstd::system_clock的滴答事件是同步的,因此毫秒周期可能与当前秒的定期更新不同步由系统时钟给出。

由于这些原因,当<1秒精度至关重要时,不应使用单独的高分辨率时钟,以达到毫秒分辨率。

答案 1 :(得分:0)

除了使用boost :: chrono之外,我不知道任何与系统无关的方法。我已经为windows和posix实现了以下内容:

   LgrDate LgrDate::gmt()
   {
      LgrDate rtn;
#ifdef _WIN32
      SYSTEMTIME sys;
      GetSystemTime(&sys);
      rtn.setDate(
         sys.wYear,
         sys.wMonth,
         sys.wDay);
      rtn.setTime(
         sys.wHour,
         sys.wMinute,
         sys.wSecond,
         sys.wMilliseconds*uint4(nsecPerMSec));
#else
      struct timeval time_of_day;
      struct tm broken_down;
      gettimeofday(&time_of_day,0);
      gmtime_r(
         &time_of_day.tv_sec,
         &broken_down);
      rtn.setDate(
         broken_down.tm_year + 1900,
         broken_down.tm_mon + 1,
         broken_down.tm_mday);
      rtn.setTime(
         broken_down.tm_hour,
         broken_down.tm_min,
         broken_down.tm_sec,
         time_of_day.tv_usec * nsecPerUSec);
#endif
      return rtn;
   } // gmt

答案 2 :(得分:0)

在POSIX系统上我会做

#include <sys/time.h>
#include <sys/resource.h>

struct timespec tspec;
clock_gettime(CLOCK_REALTIME, &tspec);
int sec = (int) tspec.tv_sec;
int msec = (int) ((double) tspec.tv_nsec) / 1000000.0;

注意,CLOCK_REALTIME用于获取挂钟,使用NTP调整挂钟

然后使用你对h:m:s part

的任何东西