Инструменты для разбора базы данных tzdata в C

Как можно проанализировать базу данных tzdata (опубликованную IANA или поставщиками операционной системы), чтобы получить историческую информацию о часовом поясе?

Например, я хотел бы знать, какое было смещение времени по Гринвичу в Asia/Tokyo в определенный момент времени, как 1435100000 который был на самом деле 2015-04-25T22:13:20+00:00 (UTC)

1 ответ

Обычно вам не нужно анализировать файлы данных самостоятельно, чтобы ответить на этот вопрос.

В большинстве версий Unix и Linux эта программа даст вам смещение времени, которое вы ищете:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
    time_t t = 1435100000;
    struct tm *tmp;
    setenv("TZ", "Asia/Tokyo", 1);
    tzset();
    tmp = localtime(&t);
    printf("offset = %ld\n", tmp->tm_gmtoff);
}

К сожалению, tm_gmtoff Область, на которую опирается эта программа, хотя и чрезвычайно полезная, является нестандартной. (В некоторых версиях Unix его можно назвать _tm_gmtoff, По некоторым версиям он может вообще не существовать.) Если у вас нет tm_gmtoff доступны, или если вы хотите, чтобы ваш код был максимально переносимым, вы можете использовать этот трюк:

time_t t2;
tmp = gmtime(&t);
t2 = mktime(tmp);
printf("offset = %ld\n", t - t2);

Для Unix, Linux, MacOS и любых платформ, использующих код и данные IANA, подобные программы должны давать правильный результат для любого часового пояса и в любое время с 1 января 1970 года.

В период до 1 января 1970 г. обычные данные IANA не являются исчерпывающими, поэтому, если вам нужно работать с более старыми датами и временем, вам может потребоваться сделать что-то другое. (Данные IANA действительно имеют некоторый охват правил часовых поясов до 1970 года, но они не настолько полны и не претендуют на определенность.)

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

Другие вопросы по тегам