Подтвердить что ты не робот

Когда std:: chrono epoch?

std::chrono::time_point::time_since_epoch() возвращает a duration, упомянутый в прошлом time_point. Когда такое time_point? Это зависит от реализации С++ или определяется стандартом С++? Или это де-факто стандарт, чтобы установить эпоху до 1 января 1970 г. UTC?

4b9b3361

Ответ 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