我建議使用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
我的猜測是我的軟件不會持續到宇宙的盡頭。我要買它!謝謝! –