从持续时间构造std::chrono::system_clock::time_point
Constructing std::chrono::system_clock::time_point from a duration
我有一个数据源,它提供自一天开始(00:00:00Z(以来的时间。我想在这个输入的基础上构造一个std::chrono::time_point
。
为了举例说明,当前时间为2020-02-27T001:05:30.67073184。我的源代码为我提供了一个二进制编码的十进制值,精确到0.01秒。我构造intermediate值来将解析/中介与组合分离。
using Days = std::chrono::duration<int, std::ratio<86400>>;
auto hr10 = std::chrono::duration<unsigned, std::ratio<36000>> ( 0 );
auto hr1 = std::chrono::duration<unsigned, std::ratio<3600>> ( 1 );
auto mn10 = std::chrono::duration<unsigned, std::ratio<600>> ( 0 );
auto mn1 = std::chrono::duration<unsigned, std::ratio<60>> ( 5 );
auto sc10 = std::chrono::duration<unsigned, std::ratio<10>> ( 3 );
auto sc1 = std::chrono::duration<unsigned, std::ratio<1>> ( 0 );
auto ms100 = std::chrono::duration<unsigned, std::ratio<1, 10>> ( 6 );
auto ms10 = std::chrono::duration<unsigned, std::ratio<1, 100>>( 8 );
auto t = hr10 + hr1 + mn10 + mn1 + sc10 + sc1 + ms100 + ms10; // 393068
auto now = std::chrono::system_clock::now();
auto sinceEpoch = now.time_since_epoch(); // 1582765530687073184 ns
auto today = std::chrono::duration_cast<Days>(sinceEpoch); // 18319 days
auto sinceDay = sinceEpoch - today; // 3930687073184 ns
// There is logic to determine if there is a day roll-over; it is not relevant here
auto adjust = Days(0);
// Create the time_point
auto tp = std::chrono::system_clock::time_point();
std::cout << "ntnull: " << tp.time_since_epoch().count();
tp += today;
std::cout << "nttoday: " << tp.time_since_epoch().count();
tp += adjust;
std::cout << "ntadjust: " << tp.time_since_epoch().count();
tp += t;
std::cout << "ntt: " << tp.time_since_epoch().count();
std::cout << "ntall-in-one: " << decltype(tp)(today+adjust+t).time_since_epoch().count();
这将产生以下输出:
null: 0
today: 1582761600000000000
adjust: 1582761600000000000
t: 1582765530680000000
all-in-one: 36577304120000000
我不明白的是,为什么将每个duration
递增地添加到time_point
中会产生所需的效果,但尝试从聚合持续时间构建time_point
却不会。
通过直接添加duration
对象,刻度计数器溢出。
您给出了持续时间刻度计数器类型int
和unsigned
。它们的常见类型是unsigned
。因此,所有的数学运算都是在unsigned
中为today+adjust+t
完成的。
假设32位unsigned
,则典型的最大值为2^32-1 = 4294967295
。您期望得到的值是1582761600000000000
,它显然更大。
只需使用unsigned long long
(或足够大的固定大小整数类型(作为duration
刻度计数器类型。
用于system_clock::duration
(从而用于system_clock::time_point
(的类型可能具有比unsigned
更高的秩,并且似乎能够存储完整的数字。
在声明自己的持续时间类型时,使用64位值
问题是从Days
转换时持续时间溢出。更改自定义持续时间类型以使用64位整数消除了问题:
auto hr10 = std::chrono::duration<uint64_t, std::ratio<36000>> ( std::get<0>(bcd) );
auto hr1 = std::chrono::duration<uint64_t, std::ratio<3600>> ( std::get<1>(bcd) );
auto mn10 = std::chrono::duration<uint64_t, std::ratio<600>> ( std::get<2>(bcd) );
auto mn1 = std::chrono::duration<uint64_t, std::ratio<60>> ( std::get<3>(bcd) );
auto sc10 = std::chrono::duration<uint64_t, std::ratio<10>> ( std::get<4>(bcd) );
auto sc1 = std::chrono::duration<uint64_t, std::ratio<1>> ( std::get<5>(bcd) );
auto ms100 = std::chrono::duration<uint64_t, std::ratio<1, 10>> ( std::get<6>(bcd) );
auto ms10 = std::chrono::duration<uint64_t, std::ratio<1, 100>>( std::get<7>(bcd) );
或者,如果不需要,在添加today
:之前,将t
强制转换为更大的类型
auto tp = std::chrono::system_clock::time_point(
std::chrono::duration_cast::microseconds(t) + today + adjust
);
请记住,自1970年以来的纳秒数是一个很大的数字,肯定会溢出32位的数量。
- 使用 SendInput 或 mouse_event 不适用于 clock()?
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 为什么我会收到"Run-Time Check Failure #2 - Stack around the variable 'pr' was corrupted"错误?
- 解析某些行的文本和输出"time of appearance"
- 返回time()库函数的数据类型
- 如何将 time-uuid(存储在 boost uuid 中)转换为时间戳/自纪元以来的时间?
- 如何从 boost::p osix_time::p time 获取秒数
- 调用 dll 函数时"Run-Time Check Failure #0 - The value of ESP"
- C++ SRAND(time(0)) 在猜谜游戏中不起作用
- 为什么我们可以在 c++ 中使用 srand(clock())?
- 即使包含 <time.h 后仍"‘CLOCK_PER_SEC’ was not declared in this scope"错误>
- struct TM time;vs TM time = {}.输出相同但不相同?
- 使用 Windows 寄存器查找下一个"Daylight Saving Time"
- 除了使用 clock() 函数之外,有没有更好的方法来以给定的频率生成/发布数据
- c++ get millsecond time
- "Feature X requires run-time support"的含义是什么?
- 如何传递以 "size determined at run time" 作为引用的动态分配数组?
- constexpr - "Evaluate value at compile time"到底是什么意思?
- "Time"库形式 Arduino 显示不正确的值
- 与来自 time.h 的标识符'clock'冲突。