Существует ли портативный способ перевода часового пояса локальной системы в логический тип 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);
Не портативный, но, по крайней мере, это правильно.