c++11 - 使用不同持续时间(std::chrono::milliseconds 和 std::chrono::nanoseconds)创建的 time_point 是如何如此不同的
问题描述
我已经创建std::chrono::milliseconds ms
并std::chrono::nanoseconds ns
从std::chrono::system_clock::now().time_since_epoch()
. 从那段时间开始,我创建timepoints
并将其转换为time_t
using并使用函数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;
}
解决方案
这一行:
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()
。
推荐阅读
- text - 在文本编辑器中一次编辑多行
- python - 如何在特定时间间隔后自动运行我的 python 模型?
- ruby-on-rails - 将 rails 升级到 6.1.0 和 ruby 2.7 后未初始化的常量 Logger::SimpleFormatter (NameError)
- c# - 当我使用 Process.Start("explorer.exe", path); 时,Windows 资源管理器正在我的 wpf 应用程序后面打开。
- forestadmin - 如何将 zip 文件上传到森林管理员?
- python - 为字典列表的每个元素添加一对键/值
- javascript - 获取数据后:新状态未定义
- sql - 从没有外键的两个模型的 JOIN 中检索值(Django)
- azure-data-factory - 在 ADF ARM 模板中参数化自托管集成运行时
- sql - SQL:尝试获取用户第一笔交易时的交易数量(新收入)