我已经创建了std::chrono::milliseconds ms
和std::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;
}
答案 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::duration
是nanoseconds
,就不会有错误。
但是,如果您使用的是llvm的libc ++,则system_clock::duration
是microseconds
,您将无声地将持续时间乘以1000。
如果您使用的是Visual Studio,则system_clock::duration
是100 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;
}