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