LINUX.ORG.RU

Местное время в c/c++ программах.

 


1

1

https://man7.org/linux/man-pages/man3/clock_gettime.3.html

  CLOCK_REALTIME
    A settable system-wide clock that measures real (i.e., wall-clock) time.

«wall-clock time» это местное время (local time) и, вызвав clock_gettime(CLOCK_REALTIME, &ts), я получаю количество секунд скорректированное с учетом зоны заданной в /etc/localtime.

Поведение gettimeofday() будет точно таким же, т.к. под капотом там тот же вызов clock_gettime(CLOCK_REALTIME, &ts).

Все так или есть какие-то опции системы и/или ядра отвечающие за результат clock_gettime() — с учетом зоны или нет (UTC)?


Переменная окружения TZ. Ставишь TZ=UTC, будет время UTC, не ставишь - локальное.

JaM
()
Ответ на: комментарий от JaM

TZ не установлена, но gettimeofday(&TV, NULL) дает UTC.

root@xyz:~# date
Mon Feb 14 14:48:54 MSK 2022
root@xyz:~# env TZ
env: 'TZ': No such file or directory

TV.tv_sec = 1644839651

1644839651 = 14.02.2022 11:54:11
Vic
() автор топика

«wall-clock time» это местное время (local time)

Сомневаюсь в правдивости этого утверждения. Man-страница говорит о том, что CLOCK_REALTIME отсчитывается от Epoch. В метке времени UNIX нет зависимости от часового пояса, так что и в CLOCK_REALTIME тоже не должно быть.

Для определения местного времени есть localtime(). Она учитывает часовой пояс.

i-rinat ★★★★★
()
Ответ на: комментарий от Vic

gettimeofday(&TV, NULL) дает UTC

gettimeofday тоже отсчитывает число секунд от Epoch, то есть тоже не зависит от часового пояса.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

А как мне получить местное время в том же формате timeval (или любом аналогичном) без промежуточных преобразований в struct tm и обратно?

Vic
() автор топика
Ответ на: комментарий от Vic

Если плевать на аккуратность, то можешь вызвать tzset(), чтобы установить значение глобальной переменной timezone, а потом вычитать из поля .tv_sec в структуре timeval значение timezone.

Но это будет криво, с ошибками вокруг смены часовых поясов, потому что корректно обрабатывать такое будут только функции типа localtime(), потому что они используют базу данных исторических смен часовых поясов.

i-rinat ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.