功能 mktime 需要一个 struct tm 作为论证。成员之一 struct tmtm_isdst. 。您可以将其设置为 1(冬季)、0(夏季)或 -1(如果您不知道)。

但是,如果在冬天,您尝试转换 2009-09-01 00:00, mktime 没有看到虽然现在是冬季,但您要转换的日期是夏季。所以结果是休息了一个小时。对我来说(GMT+1)是 2009-08-31 22:00, ,虽然应该是 23:00.

有没有办法确定特定日期是夏季还是冬季?是否可以在冬天将夏季日期转换为 UTC?

(我偶然发现这个问题试图回答 这个问题)

有帮助吗?

解决方案

这是(许多)之一 缺陷 在里面 时间 处理 接口 在标准C中。另请参阅 奥尔森 时区数据库。例如,没有一种简单的方法可以找到时区何时在冬季和夏季(夏令时和标准时间)之间切换。当然,未来的任何事情都是预测——规则集经常变化(当前版本是 2017年a).

据您所知,是否有 UNIX 特定的解决方案?

我看了一下tzcode2017a.tar.gz中的代码, mktime() 如果将 tm_isdst 设置为 -1 (未知),则其行为将如您所愿。因此,如果您使用该(公共领域)代码,您可能会没事。引用与 Olson 代码一起分发的“localtime(3)”:

Mktime 将 tm 指向的结构中以本地时间表示的分解时间转换为日历时间值,其编码与时间函数返回的值的编码相同。的原始值 tm_wdaytm_yday 该结构的组件被忽略,并且其他组件的原始值不被限制在其正常范围内。(正值或零值 tm_isdst 原因 mktime 分别假设夏令时(例如美国的夏令时)在指定时间有效或无效。负值 tm_isdst 导致 mktime 尝试推测夏令时在指定时间内是否有效的函数;在这种情况下,它不使用一致的规则,并且当稍后提出相同的论点时可能会给出不同的答案。)

我相信关于“一致规则”的最后一个警告意味着,如果时区的规范发生变化(例如,美国从四月的第一周更改为三月的第二周,以更改为夏令时)意味着如果您确定规则更改之前和规则更改之后的某个时间,则相同的输入数据将给出不同的输出。

(注意,有有用的 HTML 文件 ftp://ftp.iana.org/tz/ 目录,例如 ftp://ftp.iana.org/tz/tz-link.html.)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top