不同持续时间(std :: chrono :: milliseconds和std :: chrono :: nanoseconds)创建的time_point有何不同

时间:2018-07-26 11:43:41

标签: c++11 chrono

我已经创建了std::chrono::milliseconds msstd::chrono::nanoseconds ns  来自std::chrono::system_clock::now().time_since_epoch()。在这段时间内,我创建了timepoints并使用time_t将其转换为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;
}

3 个答案:

答案 0 :(得分:1)

此行:

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::durationnanoseconds,就不会有错误。

但是,如果您使用的是llvm的libc ++,则system_clock::durationmicroseconds,您将无声地将持续时间乘以1000。

如果您使用的是Visual Studio,则system_clock::duration100 nanoseconds,您将无声地将持续时间乘以100。

Here is a video tutorial for <chrono>可能会有所帮助,并包含有关使用.count().time_since_epoch()的警告。

答案 1 :(得分:0)

您手动进行的转换看起来不正确。

您应该使用duration_cast进行转换,因为它们是类型安全的:

auto today_day = duration_cast<duration<unsigned, std::ratio<86400>>>(ms);
auto same_day = duration_cast<system_clock::duration>(ns);

输出:

today is: Thu Jul 26 01:00:00 2018
today is: Thu Jul 26 13:01:08 2018

答案 2 :(得分:0)

因为您丢弃了持续时间信息,然后将整数值解释为不同的持续时间类型

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

毫秒->无量纲-> 1/1000秒(即毫秒)

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

纳秒->无量纲->系统时钟

您应该改为再次duration_cast

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

using namespace std::chrono;

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

    system_clock::time_point abc(duration_cast<system_clock::duration>(ms));
    system_clock::time_point abc1(duration_cast<system_clock::duration>(ns));

    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;
}