关于时区:获取C中时区的夏令时转换日期

Get Daylight Saving Transition Dates For Time Zones in C

在C中,是否有一种简单的跨平台方法来检索给定时区开始和结束夏令时的日期?

我已经有时区偏移信息以及当前是否正在观察夏令时,但我确实需要夏令时开始和结束的日期(对于我无法控制的外部依赖)。 在Windows中,我使用GetTimeZoneInformation来获取TimeZoneInfo,但是我找不到类似的Linux / Solaris / Mac功能。
我还应该指出,我不能仅仅依靠美国的夏令时采用规则,因为我无法预测它将被用于的国家。

我知道获取此信息的唯一方法是通过zdump或者直接查看/ usr / share / lib / zoneinfo文件本身,但我希望有更好的解决方案。

感谢您的任何帮助,您可以提供。


处理此问题的便携且一致的方法是在应用程序启动时构建全年TZ偏移表(当前时区当前每年的每一天)。将当天午夜当地时间解析为UTC(GMT),并记录相关日期的UTC(GMT)的有效时区偏移量。在全年有效TZ偏移中查找转换(转换将指示DST更改。)此方法一致且可移植,仅依赖于localtime / gmtime在相关平台上可靠地运行,并将完全返回结果与localtime / gmtime调用一致。但是,如果您需要其他时区的DST信息(比进程的默认时区),它会变得有点复杂。

您还可以直接使用TZ / Olson数据库(可用于* nix和Windows的代码),以获得最大的灵活性,但除非底层运行时/操作系统使用完全相同的时区信息(并且您的应用程序使用TZ / Olson时区信息和< x3> / localtime可互换)然后你就会遇到令人不快的意外。


我不确定这是一个很好的跨平台方式,但tzfile.h中有/usr/share/zoneinfo文件的编程接口(或至少是格式的描述),(在Mac OS X和Linux的)。

Windows使用与tzinfo略有不同的映射,但是有一个转换表可用于生成Windows和Unix之间的接口。


In C, is there a simple, cross-platform way of retrieving the dates that a given timezone > begins and ends daylight saving?

没有。

我在90年代后期在DEC上为VMS实施了TZ支持。

首先,没有跨平台的解决方案。

其次,日期每年都有所不同,也有立法法令。实际上没有完全可靠的程序化解决方案。


如果您需要C ++(而不是C),请查看boost :: date_time库http://www.boost.org/doc/libs/1_38_0/doc/html/date_time.html