std::chrono::system_clock + now() 到毫秒并返回不同的行为
std::chrono::system_clock + now() to milliseconds and back different behavior
我对找到一种将毫秒转换为 std::chrono::system_time::time_point
的便携方法感到有点困惑。我看起来像代码:
https://godbolt.org/z/e7Pr3oxMT
#include <chrono>
#include <iostream>
int main ()
{
auto now = std::chrono::system_clock::now();
auto now_ms = std::chrono::time_point_cast<std::chrono::milliseconds>(now);
auto value = now_ms.time_since_epoch();
long duration = value.count();
std::cout << duration << std::endl;
std::chrono::milliseconds dur(duration);
std::chrono::time_point<std::chrono::system_clock> dt(dur);
if (dt != now_ms)
std::cout << "Failure." << std::endl;
else
std::cout << "Success." << std::endl;
return 0;
}
在 win32 和 linux 上应该是一样的。但不幸的是,在 windows (msvc) 上,我得到 Failure
作为输出。
请协助了解问题所在?
问题大概是
long duration = value.count();
类型 long
不一定是 64 位宽。除了 char
之外,C++ 标准没有定义整数类型的确切大小。例如,即使在 x64 构建中,Visual Studio long
也使用 32 位。
无论如何,试试
uint64_t duration = value.count();
在您的代码中或只是
auto duration = value.count();
我对找到一种将毫秒转换为 std::chrono::system_time::time_point
的便携方法感到有点困惑。我看起来像代码:
https://godbolt.org/z/e7Pr3oxMT
#include <chrono>
#include <iostream>
int main ()
{
auto now = std::chrono::system_clock::now();
auto now_ms = std::chrono::time_point_cast<std::chrono::milliseconds>(now);
auto value = now_ms.time_since_epoch();
long duration = value.count();
std::cout << duration << std::endl;
std::chrono::milliseconds dur(duration);
std::chrono::time_point<std::chrono::system_clock> dt(dur);
if (dt != now_ms)
std::cout << "Failure." << std::endl;
else
std::cout << "Success." << std::endl;
return 0;
}
在 win32 和 linux 上应该是一样的。但不幸的是,在 windows (msvc) 上,我得到 Failure
作为输出。
请协助了解问题所在?
问题大概是
long duration = value.count();
类型 long
不一定是 64 位宽。除了 char
之外,C++ 标准没有定义整数类型的确切大小。例如,即使在 x64 构建中,Visual Studio long
也使用 32 位。
无论如何,试试
uint64_t duration = value.count();
在您的代码中或只是
auto duration = value.count();