如何使用C获取时区信息

问题描述 投票:0回答:2

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

在 Cocoa 中,有很多很棒的东西,比如使用

timeZoneWithAbbreviation:
从字符串描述符创建 NSTimeZone 对象。这使我能够使用“Europe/Paris”等值轻松创建 NSTimeZone 对象。 对我来说另一个重要的方法是
secondsFromGMTForDate:
,因为它会自动为您考虑 DST 规则。

现在,我在 C 中找到的最接近 NSTimeZone 的是

struct timezone
(参见 here)。但是,我不知道如何轻松获得特定时间和时区的 GMT“偏移”(以秒为单位)。如果您只有“欧洲/巴黎”之类的描述,我也不明白如何获取时区结构。

c cocoa datetime timezone gnu
2个回答
4
投票

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

我不确定 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).


2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.