Вы столкнулись с переполнением в system_clock::time_point
.
Точность system_clock::time_point
зависит от платформы:
- g cc: наносекунды
- Windows: 1/10 микросекунды
- clang / libc ++: микросекунд
Но представление одинаково на всех трех платформах: 64-битный интеграл со знаком. И все это соответствует.
64 бита наносекунд со знаком дают вам диапазон примерно +/- 292 года. Для system_clock
этот диапазон сосредоточен на 01.01.1970. Так что переполнение в 2262 году - это нормально.
Если вам нужен больший диапазон, вы можете уменьшить свою точность. Например:
auto faketime = chrono::time_point_cast<chrono::microseconds>(chrono::system_clock::now());
Можно программно проверить пределы time_point
с помощью функций-членов time_point
stati c min()
и max()
.
Update
Диапазон в микросекундах примерно +/- 292 тысяча лет. Я не уверен, что такое диапазон на ctime
, но я был бы удивлен, если бы он мог форматировать даты так далеко в прошлом / будущем.