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

use*_*116 8 c timezone dst

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

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

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

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

vla*_*adr 5

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

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


Tod*_*lin 2

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

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