Високосные секунды и std :: chrono - PullRequest
3 голосов
/ 16 июня 2019

Я посмотрел att cppreference.org (выделение мое):

Часы std::chrono::utc_clock - это часы, которые представляют всемирное координированное время (UTC). Он измеряет время с 00:00:00 UTC, четверг, 1 января 1970 года, , включая високосные секунды .

Сравнивая это с определением system_clock:

system_clock измеряет время Unix (то есть время с 00:00:00 всемирного координированного времени (UTC), четверг, 1 января 1970 года, без учета високосных секунд ).

Действительно ли возможно иметь оба в одной и той же системе? Например, если системные часы синхронизируются через NTP, то сервер решает, который час, и который может использовать дополнительные секунды или нет, но реализация библиотеки C ++ ничего не может знать об этом. Или стандарт требует базу данных сверх того, когда была введена дополнительная секунда?

Ответы [ 2 ]

2 голосов
/ 16 июня 2019

NTP-серверы дают вам UTC (в формате секунд с 1900 года).Текущее время, это текущее время.На самом деле не имеет значения, сколько високосных секунд было, чтобы добраться туда.

Когда все усложняется, это когда добавляется високосная секунда.NTP объявит об этом в данный момент, и различные операционные системы делают различные внутренние действия, чтобы записать это, из-за их склонности сохранять время как «количество секунд с начала эпохи» - Linux и Windows не включают в себя дополнительные секунды, потому чтоэто сделало бы их рендеринг метки времени более сложным (сколько високосных секунд было?), и с ними нельзя иметь дело.Вместо этого они просто замедляют или ускоряют часы на некоторое время вокруг объявленной високосной секунды, поэтому вместо того, чтобы фактически записать это, они просто настраивают свое собственное количество секунд, чтобы рендеринг, который считается как временная метка, позже показался точным.

(Чего я не знаю, так это того, как ОС будет переопределять счетчик «не реально, но вроде секунд» из транзакции NTP, не зная, сколько високосных секунд вычитать; правка приветствуется.)

system_clock дает вам счетчик секунд, который (на основных платформах) поступает прямо из ОС (например, time()).

utc_clock дает аналогичный счетчик секунд, но тот, который "настоящий".На таких основных платформах это обязательно должен быть system_clock с дополнительными секундами, добавленными после факта.Эти исторические данные также поступают из системы, на самом деле какая-то база данных (хотя точный источник зависит от реализации).

В заключение, источники данных для этих двух часов (немного) разные, поэтому не возникает вопроса о том, могут ли они сосуществовать в одной системе.Но system_clock , вероятно, поступает непосредственно из вашей операционной системы, а utc_clock , вероятно, - нет.

Дальнейшее чтение

1 голос
/ 16 июня 2019

Я нашел этот рабочий черновик о времени для C ++ 20, который, похоже, должен быть выпущен в AD 2020. У него есть подстраница о utc_clock , которая включает в себя этот пример:

clock_­cast<utc_­clock>(sys_­seconds{sys_­days{1970y/January/1}}).time_­since_­epoch() is 0s.
clock_­cast<utc_­clock>(sys_­seconds{sys_­days{2000y/January/1}}).time_­since_­epoch()

и заявляет, что последнее значение «равно 946'684'822 с, что равно 10'957 * 86'400 с + 22с». Обратите внимание, что 10 957 дней - это около 30 лет, поэтому значение utc_clock, очевидно, представляет секунды с 1 января 1970 года по Гринвичу, где каждая секунда прыжка увеличивает значение utc_clock.

Поскольку это выражается как преобразование, представляется разумным сделать вывод, что преобразование потребовало бы таблицы дополнительных секунд и могло бы быть выполнено, даже если операционная система не имела понятия о разнице между UTC и TAI и не имела понятия минуты, которая содержала 61 секунду.

Должен признать, что меня больше интересует время, чем C ++, и я почти 20 лет не писал серьезного кода на C ++.

...