我建议使用std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds>
。您可以使用类型别名更漂亮。例如:
template <class Duration>
using sys_time = std::chrono::time_point<std::chrono::system_clock, Duration>;
using sys_nanoseconds = sys_time<std::chrono::nanoseconds>;
sys_nanoseconds now = std::chrono::system_clock::now();
这可以让你在同一范围内目前公认的答案(int64_t
),但增加了类型安全。 int64_t
可能意味着一个时间点或持续时间。sys_nanoseconds
只能表示一个time_point
,如果像使用时间一样使用,将导致编译时错误。
例如,将两个sys_nanoseconds
加在一起会导致编译时错误。但是你可以减去两个sys_nanoseconds
,结果类型为std::chrono::nanoseconds
。
你的范围(前溢/下溢)将是:
1677-09-21 00:12:43.145224192 to 2262-04-11 23:47:16.854775807
要获得更大范围的以纳秒精度是有问题的价值,但可以这样做对支持128种类型的平台:
using nano128 = std::chrono::duration<__int128_t, std::nano>;
using sys_nano = sys_time<nano128>;
现在你的范围远远大于+/-宇宙的年龄。
请注意,在某些平台上,std::chrono::system_clock::now()
不会以纳秒的精度报告。因此存储纳秒时间戳可能会过度。然而,采取上面的代码并将其更改为任何你想要的单位是微不足道的。
在macOS上,system_clock::now()
报告为microseconds
,其将具有范围为nanoseconds
的1000倍。在Windows上,以1/10的microseconds
单位system_clock::now()
报道:
using win_sys_duration = std::chrono::duration<std::int64_t,
std::ratio<1, 10'000'000>>;
using win_sys_time_point = sys_time<win_sys_duration>;
而且在GCC,system_clock::now()
报告nanoseconds
。
稍微超过584年适合内部精度为毫微秒的无符号64位整数。所以是的,我认为OP会很好。 – rwols
我期待这款软件在245年内死于Y2K262问题(是的,我们仍然会使用K,即使它实际上并没有缩短字符串的长度)。 :-) – ShadowRanger
我的猜测是我的软件不会持续到宇宙的尽头。我要买它!谢谢! –