Инструменты для разбора базы данных 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 код. (Но вам все равно не нужно анализировать файлы данных вручную.)