C++ std::chrono::high_resolution_clock time_since_epoch returns 数字太小。如何获得自 1970 年以来以微秒为单位的正确时间?
C++ std::chrono::high_resolution_clock time_since_epoch returns too small numbers. How can I get the correct time since 1970 in microseconds?
我正在尝试编写一个函数,它将 return 自 1970 年以来的当前时间(以微秒为单位)。在调试时我注意到,returned 数字太小了。例如:269104616249
。我还添加了 static_assert 来检查 returned 值类型是 int64_t,我足够大以微秒为单位保持 292471
年。所以整数溢出不应该是这里的情况。
我究竟做错了什么?
这是我的代码:
int64_t NowInMicroseconds() {
static_assert(std::is_same<decltype(duration_cast<microseconds>(high_resolution_clock::now().time_since_epoch()).count()), int64_t>::value);
return duration_cast<microseconds>(high_resolution_clock::now().time_since_epoch()).count();
}
int64_t result = NowInMicroseconds();
C++11/14/17 中有三个计时提供的时钟(C++20 中更多):
system_clock
:这测量 Unix Time(自 1970 年以来的时间,不包括闰秒)。1
steady_clock
:就像秒表一样。非常适合计时,但它不能告诉你一天中的时间。
high_resolution_clock
:这个有system_clock
和steady_clock
的缺点,也没有优点。通常它是 system_clock
或 steady_clock
的类型别名,并且因平台而异。
您必须使用 system_clock
来衡量自 1970 年以来的时间。请注意,这是以 UTC 衡量的,不是 您的 local 时区。在 C++11/14/17 中,要获取 1970 年以来的当地时间,您必须手动考虑您的时区,或者使用此 C++20 chrono preview library.
std::int64_t
NowInMicroseconds()
{
using namespace std::chrono;
return duration_cast<microseconds>(system_clock_clock::now().time_since_epoch()).count();
}
考虑返回一个强类型,这意味着“自 1970 年以来的微秒”,而不是整数类型。强类型安全帮助您在编译时发现您的逻辑错误:
std::chrono::time_point<std::chrono::system_clock, std::chrono::microseconds>
NowInMicroseconds()
{
using namespace std::chrono;
return time_point_cast<microseconds>(system_clock.now());
}
1 这在 C++11/14/17 中未指定,但在所有实现中都是如此。 C++20 finally nails this epoch down in the spec.
我正在尝试编写一个函数,它将 return 自 1970 年以来的当前时间(以微秒为单位)。在调试时我注意到,returned 数字太小了。例如:269104616249
。我还添加了 static_assert 来检查 returned 值类型是 int64_t,我足够大以微秒为单位保持 292471
年。所以整数溢出不应该是这里的情况。
我究竟做错了什么?
这是我的代码:
int64_t NowInMicroseconds() {
static_assert(std::is_same<decltype(duration_cast<microseconds>(high_resolution_clock::now().time_since_epoch()).count()), int64_t>::value);
return duration_cast<microseconds>(high_resolution_clock::now().time_since_epoch()).count();
}
int64_t result = NowInMicroseconds();
C++11/14/17 中有三个计时提供的时钟(C++20 中更多):
system_clock
:这测量 Unix Time(自 1970 年以来的时间,不包括闰秒)。1steady_clock
:就像秒表一样。非常适合计时,但它不能告诉你一天中的时间。high_resolution_clock
:这个有system_clock
和steady_clock
的缺点,也没有优点。通常它是system_clock
或steady_clock
的类型别名,并且因平台而异。
您必须使用 system_clock
来衡量自 1970 年以来的时间。请注意,这是以 UTC 衡量的,不是 您的 local 时区。在 C++11/14/17 中,要获取 1970 年以来的当地时间,您必须手动考虑您的时区,或者使用此 C++20 chrono preview library.
std::int64_t
NowInMicroseconds()
{
using namespace std::chrono;
return duration_cast<microseconds>(system_clock_clock::now().time_since_epoch()).count();
}
考虑返回一个强类型,这意味着“自 1970 年以来的微秒”,而不是整数类型。强类型安全帮助您在编译时发现您的逻辑错误:
std::chrono::time_point<std::chrono::system_clock, std::chrono::microseconds>
NowInMicroseconds()
{
using namespace std::chrono;
return time_point_cast<microseconds>(system_clock.now());
}
1 这在 C++11/14/17 中未指定,但在所有实现中都是如此。 C++20 finally nails this epoch down in the spec.