【发布时间】: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
预期结果
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作为这个函数的结果。 -
那么您需要在格式化程序中指定时区,就像您在“解决方法”中所做的那样。