首页 > 解决方案 > 使用不同持续时间(std::chrono::milliseconds 和 std::chrono::nanoseconds)创建的 time_point 是如何如此不同的

问题描述

我已经创建std::chrono::milliseconds msstd::chrono::nanoseconds nsstd::chrono::system_clock::now().time_since_epoch(). 从那段时间开始,我创建timepoints并将其转换为time_tusing并使用函数system_clock::to_time_t 打印它。ctime但是打印的时间不一样。据我了解,time_point有持续时间和持续时间有代表和周期(比率)。因此 time_point 在两个 time_points 中必须具有相同的值,直到毫秒精度。为什么输出不一样?

这是我的代码

#include <ctime>
#include <ratio>
#include <chrono>
#include <iostream>

using namespace std::chrono;

int main ()
{
    std::chrono::milliseconds ms = std::chrono::duration_cast < std::chrono::milliseconds > (std::chrono::system_clock::now().time_since_epoch());

    std::chrono::nanoseconds ns = std::chrono::duration_cast< std::chrono::nanoseconds > (std::chrono::system_clock::now().time_since_epoch());

    std::chrono::duration<unsigned int,std::ratio<1,1000>> today_day (ms.count());

    std::chrono::duration<system_clock::duration::rep,system_clock::duration::period> same_day(ns.count());

    system_clock::time_point abc(today_day);
    system_clock::time_point abc1(same_day);

    std::time_t tt;        

    tt = system_clock::to_time_t ( abc );
    std::cout << "today is: " << ctime(&tt);

    tt = system_clock::to_time_t ( abc1 );
    std::cout << "today is: " << ctime(&tt);

    return 0;
}

标签: c++11chrono

解决方案


这一行:

std::chrono::duration<unsigned int,std::ratio<1,1000>> today_day (ms.count());

溢出。自 1970 年以来的毫秒数约为 1.5 万亿。但是unsigned int(在你的平台上)溢出了大约 40 亿。

此外,根据您的平台,此行:

std::chrono::duration<system_clock::duration::rep,system_clock::duration::period> same_day(ns.count());

可能会引入转换错误。如果您使用的是 gcc,system_clock::duration则 is nanoseconds,并且不会出现错误。

但是,如果您使用的是 llvm 的 libc++,system_clock::duration那么microseconds您将默默地将持续时间乘以 1000。

如果您使用的是 Visual Studio,system_clock::duration那么100 nanoseconds您将默默地将持续时间乘以 100。

这是一个视频教程<chrono>可能会有所帮助,并包含有关使用.count()和的警告.time_since_epoch()


推荐阅读