Работа с часовыми поясами в Си - PullRequest
3 голосов
/ 05 мая 2010

В настоящее время я перемещаю часть своего кода из Cocoa (Apple Objective-C API) в C, чтобы сделать его доступным для других операционных систем, таких как GNU / Linux.

В Какао было много замечательных вещей, таких как создание объектов NSTimeZone из их строковых дескрипторов с использованием timeZoneWithAbbreviation:. Это позволило мне использовать такие значения, как «Европа / Париж», чтобы легко создавать объекты NSTimeZone. Другим важным методом для меня был secondsFromGMTForDate:, потому что он автоматически учитывает правила DST для вас.

Прямо сейчас самая близкая вещь к NSTimeZone, которую я нашел для C, это struct timezone (см. здесь ). Тем не менее, я не вижу, как я могу легко получить «смещение» GMT в секундах для определенного времени и часового пояса. Я также не понимаю, как получить структуру часового пояса, если у вас есть только описание типа «Европа / Париж».

Ответы [ 2 ]

4 голосов
/ 05 мая 2010

Это мое понимание, и я могу ошибаться ...

Я не уверен, как это делает OS X, но в Linux стандартные функции часового пояса C используют базу данных Olson , который действительно довольно мощный (так как он имеет полный список описаний локалей и отслеживает исторические правила часовых поясов, а также текущие правила).

Чтобы установить часовой пояс, позвоните tzset .Эта функция автоматически вызывается другими функциями, связанными со временем, но вы можете вручную указать другой часовой пояс из системного значения по умолчанию, установив переменную среды TZ, затем вызвав tzset.Например:

int main(int argc, char *argv[]) {
    time_t t = time(NULL);
    printf("%s\n", ctime(&t));

    setenv("TZ", "America/Chicago", 1);
    printf("%s\n", ctime(&t));

    return 0;
}

Вызов tzset также устанавливает глобальную переменную timezone, которую можно использовать для поиска смещения по Гринвичу в секундах для текущего часового пояса.

Эти функции позволяют толькоВы используете один часовой пояс за раз, и хотя все это (за исключением, возможно, глобальной переменной timezone) должно быть стандартным C, платформы, кроме Linux, могут не иметь полной поддержки списков локалей, изменения летнего времени,и т.д. Если вы обнаружите, что это не соответствует вашим потребностям, вы можете попробовать использовать сторонние библиотеки, такие как код, распространяемый вместе с [база данных Olson] или ICU TimeZone class (также можно использовать из C).

2 голосов
/ 05 мая 2010

К сожалению, вы вступаете на сложную территорию. Нет хорошей, широко доступной библиотеки часовых поясов, не связанной с другими крупными проектами. Вы можете посмотреть на код, который поставляется с базой данных Olson (часовых поясов), и посмотреть на ICU (Компоненты интернационализации для Unicode).

...