gpt4 book ai didi

ios - DateFormatter 使用不正确的时区格式化字符串

转载 作者:行者123 更新时间:2023-11-30 11:14:48 25 4
gpt4 key购买 nike

先决条件

在手机设置中设置时区 GMT+13(法莱、托克劳)。

实现

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()

结果

结果 = "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 - If unspecified, the system time zone is used.

我的函数应返回 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吗?

最佳答案

这个问题很有趣,因为事实证明这是由时区引起的: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

关于ios - DateFormatter 使用不正确的时区格式化字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51844309/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com