在冬天将夏季日期转换为 UTC?

Posted

技术标签:

【中文标题】在冬天将夏季日期转换为 UTC?【英文标题】:Convert a summer date to utc in the winter? 【发布时间】:2010-12-18 11:36:00 【问题描述】:

函数mktimestruct tm 作为参数。 struct tm 的成员之一是tm_isdst。您可以将其设置为 1 表示冬季,0 表示夏季,或 -1 如果您不知道。

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

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

(我在尝试回答this question时遇到了这个问题)

【问题讨论】:

【参考方案1】:

这是标准 C 中 time 处理 interfaces 中的(许多)deficiencies 之一。另请参见 Olson 时区数据库。例如,没有一种简单的方法来查找时区何时在冬季和夏季(夏令时和标准)时间之间切换。当然,未来的任何事情都是一种预测——规则集经常变化(当前版本是2017a)。

据您所知,有没有针对 UNIX 的解决方案?

我查看了 tzcode2017a.tar.gz 中的代码,如果您将 tm_isdst 设置为 -1(未知),那里的 mktime() 会按照您的意愿行事。所以,如果你使用那个(公共领域)代码,你会没事的——可能。引用随 Olson 代码分发的“localtime(3)”:

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

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

(注意ftp://ftp.iana.org/tz/目录下有一些有用的html文件,比如ftp://ftp.iana.org/tz/tz-link.html。)

【讨论】:

+1 有趣。据您所知,是否有针对 UNIX 的解决方案?

以上是关于在冬天将夏季日期转换为 UTC?的主要内容,如果未能解决你的问题,请参考以下文章

如何将UTC秒数转换为日期,100分,在线等

如何将日期正确转换为 UTC,然后再转换回来?

如何将JavaScript日期转换为UTC?

Javascript将日期转换为UTC [重复]

如何将存储为 VARCHAR 的 UTC 日期时间值转换为常规日期时间

JavaScript:将 UTC 日期时间转换为传递时区的日期时间