Страница
POSIX для tzset описывает глобальную переменную extern long timezone
, которая содержит местный часовой пояс в виде смещения секунд от UTC. Это будет присутствовать во всех POSIX-совместимых системах.
Чтобы часовой пояс содержал правильное значение, вам, вероятно, потребуется вызвать tzset()
во время инициализации вашей программы.
Затем вы можете просто добавить timezone
к выводу mktime
, чтобы получить вывод в UTC.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
time_t utc_mktime(struct tm *t)
{
return mktime(t) + timezone;
}
int main(int argc, char **argv)
{
struct tm t = { 0 };
tzset();
utc_mktime(&t);
}
Примечание. Технически tzset()
и mktime()
не гарантируют поточно-ориентированной .
Если поток обращается к tzname, [XSI] [Option Start] дневному свету или часовому поясу [Option End] напрямую, когда другой поток находится в вызове tzset (), или к любой функции, которой требуется или разрешено устанавливать информацию о часовом поясе как будто при вызове tzset () поведение не определено.
... но большинство реализаций есть. GNU C использует мьютексы в tzset()
, чтобы избежать одновременных модификаций глобальных переменных, которые он устанавливает, а mktime()
видит очень широкое применение в многопоточных программах без синхронизации. Я подозреваю, что если кто-то столкнется с побочными эффектами, он будет использовать setenv()
для изменения значения TZ
, как это было сделано в ответе @ liberforce.