Существует ли портативный способ перевода часового пояса локальной системы в логический тип icaltime?

libical, похоже, принимает только название города Олсен для поиска часовых поясов в своей базе данных. То, что у меня есть, это переносимая структура, которая имеет смещение по Гринвичу и сокращенный 3-4-буквенный код (EST/EDT и т. Д.), Но нет функции, которая принимает это в libical.

У меня есть очень паршивый способ, когда я сканирую список tz из libical, пытаясь сопоставить имена tz, и это, вероятно, сработает, но я хорошо знаю, что это плохая идея. Но я не нашел другого способа превратить местный часовой пояс в фантастический тип icaltime.

Я что-то упустил?

Под переносным я имею в виду Windows, OSX и Linux.

Это программа переменного тока, которую я пишу. Но теперь я вижу, что смещение tz не является posix, так что это не сработает.

1 ответ

Решение

Поэтому я думаю, что ответ заключается в том, что нет ответа. Ничего портативного в любом случае.

Так что у меня есть отдельные пути сборки для Linux и OSX, и я еще не дошел до Windows..

Реализация Linux просто читает из /etc/timezone (подробнее об этом на Как найти текущий часовой пояс системы?)

и реализация OSX делает это.

CFTimeZoneRef tzlocal = CFTimeZoneCopyDefault();
CFStringRef me = CFTimeZoneGetName(tzlocal);
NSString *local = (__bridge NSString *)me;
const char *tzname = [local cStringUsingEncoding:NSUTF8StringEncoding];
log.debug("Looking up timezone for %s", tzname);
// this is a built-in timezone so we don't have to free it.
local_timezone = icaltimezone_get_builtin_timezone(tzname);

Не портативный, но, по крайней мере, это правильно.

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