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

时间:2009-03-24 17:36:31

标签: c timezone dst

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

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

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

感谢您提供的任何帮助。

4 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:2)

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

Windows使用与tzinfo略有不同的映射,但是可以使用conversion table来验证Windows和Unix之间的接口。

答案 2 :(得分:1)

  

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

没有

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

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

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

答案 3 :(得分:0)

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