我建议使用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 上,system_clock::now() 以 microseconds 的 1/10 为单位报告:
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。