【问题标题】:DateFormatter formats string using incorrect time zoneDateFormatter 使用不正确的时区格式化字符串
【发布时间】:2018-08-14 14:52:57
【问题描述】:

前提条件

在手机设置中设置时区 GMT+13(Fale,Tokeleau)。

实施

extension Date {
    func formatForDto() -> String {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss ZZ"
        return dateFormatter.string(from: self)
    }
}

示例

let date = Date(timeIntervalSince1970: 320756400) // which is 1980-03-01 11:00:00 UTC
let result = date.formatForDto()

结果

result = "1980-03-01 00:00:00 -1100" 而不是 1980-03-02 00:00:00 +1300 (11:00 + 13)。

在调试器中,当我检查 dateFormatter.timeZone 里面的内容时,我得到了正确的结果:

(lldb) po dateFormatter.timeZone
▿ Optional<TimeZone>
  ▿ some : Pacific/Fakaofo (current)
    - identifier : "Pacific/Fakaofo"
    - kind : "current"
    ▿ abbreviation : Optional<String>
      - some : "GMT+13"
    - secondsFromGMT : 46800
    - isDaylightSavingTime : false

预期结果

根据documentation

DateFormatter.timeZone - 如果未指定,则使用系统时区。

我的函数应该返回1980-03-02 00:00:00 +1300

解决方法

更有趣的是,当我手动将 timeZone 设置为:

dateFormatter.timeZone = TimeZone(secondsFromGMT: 13 * 60 * 60)

然后它按预期返回1980-03-02 00:00:00 +1300

问题

那么为什么没有timeZone 设置它不能像文档中声称的那样工作并且不考虑系统的时区?是 SDK 的 bug 吗?

【问题讨论】:

  • 不,我还是不明白。你说“我明白了”。如何?你写了Date(timeIntervalSince1970: 320756400).formatForDto() // 1980-03-01 11:00:00 UTC,在评论中向我们展示了输出。然后你转身说“我得到1980-03-01 00:00:00 -1100”。但你刚刚告诉我们这不是你得到的。那么这里的“我得到”是什么意思? ——这不是一个大问题;您所要做的就是提供一个实际可重现的案例。只需显示可让我们查看您所看到内容的代码即可。
  • 此评论仅指日期,而不是 formatForDto 输出,我的错误。我更新了这部分。您现在有了可重现的案例。
  • 好的,所以你在抱怨,因为你看到这个日期时间既是1980-03-01 11:00:00 UTC,又是1980-03-01 00:00:00 -1100。为什么?它们是相同的日期时间。有什么问题?
  • 我想要1980-03-02 00:00:00 +1300 作为这个函数的结果。
  • 那么您需要在格式化程序中指定时区,就像您在“解决方法”中所做的那样。

标签: ios swift datetime


【解决方案1】:

这个问题很有趣,因为它原来是由时区引起的:Fale, Tokeleau 我假设是 GMT+13,但是根据Time Zone in Fakaofo, Tokelau 这个时区是在 2011 年 12 月 30 日之前是 GMT-11

这就是为什么对于我的示例1980-03-01 11:00:00 UTC 应用了不同的偏移量,这也是它与指定精确偏移量而不是时区的TimeZone(secondsFromGMT: 13 * 60 * 60) 一起使用的原因。

因此,如果我用日期检查我的代码:

  • 2012-03-01 11:00:00 UTC 它返回 1980-03-02 00:00:00 +1300
  • 1980-03-01 11:00:00 UTC 它返回 1980-03-01 00:00:00 -1100

【讨论】:

  • 所以这不是缺陷。一切都按原样工作。这完全是由于过去某个特定时区发生了变化。
猜你喜欢
  • 1970-01-01
  • 2018-01-01
  • 2017-09-25
  • 2018-01-16
  • 2012-05-12
  • 2014-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多