我目前正在将一些代码从 Cocoa(Apple 的 Objective-C API)迁移到 C,以便使其可用于其他操作系统,例如 GNU/Linux。
在 Cocoa 中,有很多很棒的东西,比如使用
timeZoneWithAbbreviation:
从字符串描述符创建 NSTimeZone 对象。这使我能够使用“Europe/Paris”等值轻松创建 NSTimeZone 对象。
对我来说另一个重要的方法是secondsFromGMTForDate:
,因为它会自动为您考虑 DST 规则。
现在,我在 C 中找到的最接近 NSTimeZone 的是
struct timezone
(参见 here)。但是,我不知道如何轻松获得特定时间和时区的 GMT“偏移”(以秒为单位)。如果您只有“欧洲/巴黎”之类的描述,我也不明白如何获取时区结构。
以下是我的理解,可能有错误...
我不确定 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
全局变量,您可以使用该变量查找当前时区的 GMT 偏移量(以秒为单位)。
这些函数只能让您一次使用一个时区,尽管所有这些(可能除了
timezone
全局变量)都应该是标准 C,但 Linux 以外的平台可能不完全支持语言环境列表,夏令时更改等。如果您发现这不能满足您的需求,那么您可以尝试使用第三方库,例如与[Olson数据库]一起分发的代码或ICU的TimeZone类(也可以从C).