我目前正在将我的一些代码从可可(Apple的Cocko-C API)迁移到C,以便使其可用于其他操作系统,如GNU/Linux。
在可可中,有很多很棒的东西,比如使用timeZoneWithAbbreviation:
从字符串描述符创建NSTimeZone对象。这允许我使用“Europe/巴黎”这样的值来轻松创建NSTimeZone对象。对我来说,另一个重要的方法是secondsFromGMTForDate:
,因为它会自动为您考虑DST规则。
目前,我为C找到的最接近NSTimeZone的东西是struct timezone
(参见此处)。然而,我不明白我如何可以很容易地获得GMT“偏移”在秒为特定的时间和时区。我也不明白如何获得时区结构,如果你只有一个描述,如“欧洲/巴黎”。
2条答案
按热度按时间oknwwptz1#
以下是我的理解,可能是错误的。
我不确定OS X是如何做到这一点的,但在Linux上,标准的C时区函数使用Olson database,这确实非常强大(因为它有一个完整的区域设置描述列表,并跟踪历史时区规则以及当前规则)。
要设置时区,请调用tzset。此函数会被其他与时间相关的函数自动调用,但您可以通过设置TZ环境变量然后调用tzset来手动指定与系统默认值不同的时区。举例来说:
调用tzset还会设置
timezone
全局变量,您可以使用该变量查找当前时区的GMT偏移(以秒为单位)。这些函数一次只能使用一个时区,尽管所有这些(可能除了
timezone
全局变量)都应该是标准的C语言,但Linux以外的平台可能无法完全支持地区列表、夏令时更改等。如果您发现这不能满足您的需求,那么您可以尝试使用第三方库,例如[Olson数据库]或ICU的TimeZone class(也可以从C中使用)。c90pui9n2#
不幸的是,你正踏入一个困难的领域.没有一个好的,广泛可用的时区库不附加到其他主要项目。您可以查看Olson数据库(时区)附带的代码,也可以查看ICU(Unicode的国际化组件)。