在C中使用时区

时间:2010-05-05 15:45:25

标签: c cocoa datetime timezone gnu

我目前正在将部分代码从Cocoa(Apple的Objective-C API)迁移到C,以便将其用于其他操作系统,例如GNU / Linux。

在Cocoa中,有许多很棒的东西,比如使用timeZoneWithAbbreviation:从字符串描述符创建NSTimeZone对象。这允许我使用像“Europe / Paris”这样的值来轻松创建NSTimeZone对象。 另一个重要的方法是secondsFromGMTForDate:,因为它会自动为您考虑DST规则。

现在,我找到的最接近N的NSTimeZone是struct timezone(见here)。但是,我不知道如何在特定时间和时区内以秒为单位轻松获得GMT“偏移”。如果您只有“欧洲/巴黎”这样的描述,我也不了解如何获得时区结构。

2 个答案:

答案 0 :(得分:4)

以下是我的理解,可能是错误的......

我不确定OS X是如何做到的,但在Linux上,标准的C时区函数使用Olson database,这实际上非常强大(因为它有一个完整的语言环境描述列表并跟踪历史时区规则以及当前规则。)

要设置时区,请致电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 {{3}分发的代码(也可以从C中使用)。

答案 1 :(得分:2)

不幸的是,你正在进入艰难的领域。没有一个好的,广泛可用的时区库没有附加到其他主要项目。您可以查看Olson数据库(时区)附带的代码,您可以查看ICU(Unicode的国际化组件)。