【问题标题】:"CEST" timezone changes offset to GMT during transition to/from Daylight Saving Time (it shouldn't)在夏令时转换期间,“CEST”时区更改偏移到格林威治标准时间(不应该)
【发布时间】:2019-10-29 08:32:57
【问题描述】:

UIKit 提供 TimeZone.secondsFromGMT() 方法,它简单地返回距离 GMT 时间的秒数。

截至 10 月 27 日,该函数返回的值不正确,当时欧洲已离开夏令时 (CEST-> CET)。目前返回 3600,在 10 月 27 日之前,正确返回 7200。

此函数应始终返回与当前时区无关的常量值 7200(夏令时更改时区,而不是时区本身)。即使欧洲在冬季进入 CET 时间,CEST 时间也没有改变(欧洲现在不“使用”它)。

这种行为会破坏我的单元测试,因此会破坏应用程序的正确性。

实际上这应该总是通过:

让timeZone = TimeZone(缩写:“CEST”)! XCTAssertTrue(timeZone.secondsFromGMT() == 7200)

我是不是想错了?

【问题讨论】:

  • 有点无关紧要,但我觉得值得说:TimeZone不在UIKit,它在Foundation

标签: swift uikit foundation


【解决方案1】:

你的误解在这里:

(夏令时更改时区,而不是时区本身)。即使欧洲在冬季进入 CET 时间,CEST 时间也没有改变(欧洲现在不“使用”它)。

您所说的是偏移量TimeZone 对象能够表示偏移量,即通过使用 init(secondsFromGMT:) 初始化程序创建一个。但在大多数情况下,考虑时区(例如 Europe/Paris)更有用。

init(abbreviation:) 只是查找您在TimeZone.abbreviationDictionary 中传递的字符串,并将查找到的值用作时区标识符。通过简单的检查,您会看到在字典中,CEST 对应于值Europe/Paris

标识符Europe/Paris 代表法国采用的时区。使用此标识符创建的TimeZone 对象封装了所有历史偏移转换以及未来转换的转换规则(例如“DST 在 10 月 25 日或之后的第一个星期日结束”)。

换句话说,TimeZone 对象不只是距离 GMT 的秒数。它更像是一个数学函数,将时间点映射到本地日期时间。这个函数大部分是连续的,除了发生偏移转换的那些时间点。

如果您只想要 7200 秒的恒定偏移量,请执行以下操作:

TimeZone(secondsFromGMT: 7200)

【讨论】:

    猜你喜欢
    • 2013-11-09
    • 2015-08-09
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 2011-10-30
    • 1970-01-01
    • 2013-03-10
    • 2017-02-11
    相关资源
    最近更新 更多