我正在尝试编写一个函数,它将返回自 1970 年以来的当前时间(以微秒为单位)。在调试时我注意到,返回的数字太小了。例如:269104616249
。我还添加了 static_assert 来检查返回值类型是 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 中有三个 chrono 提供的时钟(C++20 中更多):
system_clock
:测量Unix Time (自 1970 年以来的时间,不包括闰秒)。1steady_clock
:就像一个秒表。非常适合计时,但它不能告诉您一天中的时间。high_resolution_clock
:这有system_clock
和steady_clock
的缺点,也没有两者的优点。通常,它是system_clock
或steady_clock
的类型别名,并且因平台而异。
自 1970 年以来,您必须使用 system_clock
来测量时间。请注意,这是以 UTC 测量的,不是您的本地时区。在 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.
关于C++ std::chrono::high_resolution_clock time_since_epoch 返回的数字太小。如何获得自 1970 年以来以微秒为单位的正确时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68906605/