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();