Получить переход на летнее время для часовых поясов в C - PullRequest
8 голосов
/ 24 марта 2009

Есть ли в C простой кроссплатформенный способ получения дат, когда данный часовой пояс начинается и заканчивается летнее время?

У меня уже есть информация о смещении часового пояса и о том, наблюдается ли в настоящее время переход на летнее время, но мне действительно нужны даты начала и окончания перехода на летнее время (для внешней зависимости я не контролирую). В Windows я использую GetTimeZoneInformation для получения TimeZoneInfo, but I can't find a similar function for Linux/Solaris/Mac. I should point out also that I can't just rely on US rules for daylight savings adoption, as I can't predict the countries it will be used in.

The only way I'm aware of to get this information is via zdump или, возможно, смотрю непосредственно на сами файлы / usr / share / lib / zoneinfo, но я надеялся на лучшее решение.

Спасибо за любую помощь, которую вы можете предоставить.

Ответы [ 4 ]

5 голосов
/ 24 марта 2009

Переносимый и последовательный способ справиться с этим заключается в построении круглогодичной таблицы смещений TZ (для каждого дня в текущем году в текущем часовом поясе) при запуске приложения , Разрешите полуночное местное время каждого дня по UTC (GMT) и запишите эффективное смещение часового пояса относительно UTC (GMT) для соответствующего дня. Ищите переходы в эффективных смещениях TZ круглогодично (переходы будут указывать на изменения летнего времени.) Этот подход является последовательным и переносимым , поскольку зависит только от localtime / gmtime, надежно функционирующих на рассматриваемой платформе. и будет возвращать результаты, полностью соответствующие вызовам localtime / gmtime. Однако, это становится немного более сложным, если вам требуется информация о летнем времени для других часовых поясов (чем часовой пояс процесса по умолчанию.)

Вы также можете напрямую использовать базу данных TZ / Olson (код доступен как для * nix, так и для Windows), для максимальная гибкость , но если только базовый среда выполнения / ОС используют точно такую ​​же информацию о часовом поясе (а ваше приложение использует информацию о часовом поясе TZ / Olson и gmtime / localtime взаимозаменяемо), тогда вас ждут неприятные сюрпризы.

2 голосов
/ 24 марта 2009

Я не уверен, что есть хороший кроссплатформенный способ сделать это, но есть программный интерфейс для файлов /usr/share/zoneinfo (или хотя бы описание формата) в tzfile.h, (доступно в Mac OS X и Linux).

Windows использует слегка отличающиеся отображения от tzinfo, но есть таблица преобразования , которую можно использовать для генерации интерфейса между Windows и Unix.

1 голос
/ 25 марта 2009

Есть ли в C простой кроссплатформенный способ получения дат, когда указанный часовой пояс> начинается и заканчивается летнее время?

номер

Я реализовал поддержку TZ в VMS для DEC еще в конце 90-х годов.

Во-первых, нет кроссплатформенного решения.

Во-вторых, даты варьируются от года к году, а также в соответствии с законодательным актом. На самом деле не существует полностью надежного программного решения.

0 голосов
/ 13 августа 2009

Если вам нужен C ++ (не C), обратитесь к библиотеке boost :: date_time http://www.boost.org/doc/libs/1_38_0/doc/html/date_time.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...