std::chrono::time_point::time_since_epoch()
возвращает a duration
, упомянутый в прошлом time_point
. Когда такое time_point
? Это зависит от реализации С++ или определяется стандартом С++? Или это де-факто стандарт, чтобы установить эпоху до 1 января 1970 г. UTC?
Когда std:: chrono epoch?
Ответ 1
Это функция как конкретных clock
на time_point
ссылается time_point
, так и реализации этих clock
. Стандарт определяет три разные часы:
-
system_clock
-
steady_clock
-
high_resolution_clock
И в стандарте не указывается эпоха ни для одного из этих часов.
Программисты (вы) также могут создавать свои собственные часы, которые могут указывать или не указывать эпоху.
Существует де-факто (неофициальный) стандарт, согласно которому std::chrono::system_clock::time_point
имеет эпоху, совместимую с Unix Time. Это определяется как время, прошедшее с 00:00:00 по всемирному координированному времени (UTC), четверг, 1 января 1970 года, без учета високосных секунд.
Кстати, вот библиотека даты/времени, которая использует этот стандарт де-факто.
Не существует стандарта де-факто для двух других указанных часов. Кроме того, high_resolution_clock
разрешено быть псевдонимом типа для system_clock
или steady_clock
.
В OS X high_resolution_clock
является псевдонимом типа для steady_clock
, а steady_clock
- это число наносекунд с момента загрузки компьютера (никакого отношения к UTC).
Обновить
Проект спецификации С++ 2a теперь говорит для system_clock
:
Объекты типа
sys_time<Duration>
измеряют время с (и до) 1970-01-01 00:00:00 UTC, исключая високосные секунды. Эта мера обычно называется временем Unix. Эта мера способствует эффективному отображению междуsys_time
и calendar (27.8). [Пример:sys_seconds{sys_days{1970y/January/1}}.time_since_epoch()
равно0s
.sys_seconds{sys_days{2000y/January/1}}.time_since_epoch()
составляет946684800s
, что составляет10957 * 86400s
. - конец примера]
Кроме того, С++ 2a представляет utc_clock
, tai_clock
, gps_clock
и file_clock
. Эти часы также имеют четко определенные эпохи, поскольку среди них можно clock_cast
time_point
от одного time_point
до другого и system_clock
.
Эпоха file_clock
не будет переносимой, но вы все равно сможете связать ее time_point
с гражданским календарем.
utc_clock
похож на system_clock
, за исключением того, что он не игнорирует високосные секунды. Например:
#include <chrono>
#include <iostream>
int
main()
{
using namespace std::chrono;
auto s1 = sys_days{December/31/2016} + 23h + 59min + 59s;
auto s2 = sys_days{January/1/2017};
auto u1 = clock_cast<utc_clock>(s1);
auto u2 = clock_cast<utc_clock>(s2);
std::cout << s2 - s1 << '\n';
std::cout << u2 - u1 << '\n';
}
Выходы:
1s
2s