libical似乎只接受奥尔森城市名称来在其数据库中查找时区。我得到的是一个可移植的structtm,它有GMT偏移量和缩写的3-4个字母的代码(EST/EDT等),但在libical中没有接受这一点的函数。
我有一种非常糟糕的方法,我从libical扫描tz列表,试图匹配tzname,这可能会奏效,但我很清楚这是个坏主意。但我还没有找到任何其他方法将本地时区转换为性欲时间类型。
我是不是错过了一些简单的东西?
我所说的可移植是指windows、osx和linux。
这是我正在写的一个c程序。但我现在看到tz偏移不是posix,所以这不行。
所以我认为答案是没有答案。无论如何都没有可移植的东西。
所以我有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);
不可移植,但至少它是正确的。