如何在 C++ 中获取当前时间(以毫秒为单位)?
How can I get current time of day in milliseconds in C++?
问题是,我必须以某种方式以方便的格式获取以毫秒为单位的当前时间。
所需输出示例:
21 h 04 min 12 s 512 ms
我知道如何在几秒钟内得到这种格式,但我不知道如何在毫秒上得到我的手?
除了使用 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
在 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 部分使用你拥有的任何东西
使用便携std::chrono
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
时钟不支持毫秒分辨率的系统请注意
正如 , on some systems std::system_clock
might not have enough resolution for accurately representing current time in milliseconds. If that is the case, try using std::high_resolution_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_clock
和 std::system_clock
的 tick 事件似乎无法保证同步,因此毫秒周期可能与周期性更新不同步系统时钟给出的当前秒数。
由于这些原因,当 <1 秒的精度至关重要时,不应使用单独的高分辨率时钟来实现毫秒分辨率。
问题是,我必须以某种方式以方便的格式获取以毫秒为单位的当前时间。
所需输出示例:
21 h 04 min 12 s 512 ms
我知道如何在几秒钟内得到这种格式,但我不知道如何在毫秒上得到我的手?
除了使用 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
在 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 部分使用你拥有的任何东西
使用便携std::chrono
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::system_clock
might not have enough resolution for accurately representing current time in milliseconds. If that is the case, try using std::high_resolution_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_clock
和 std::system_clock
的 tick 事件似乎无法保证同步,因此毫秒周期可能与周期性更新不同步系统时钟给出的当前秒数。
由于这些原因,当 <1 秒的精度至关重要时,不应使用单独的高分辨率时钟来实现毫秒分辨率。