ios - DateFormatter返回时区的意外日期

原文 标签 ios swift foundation dateformatter

我已经阅读了多篇有关此内容的文章,其中大部分是由于未设置特定的时区以及系统获取了当前时区。我的情况略有不同,并且给出了意外的结果,因此,我将尝试详细解释。

我正在处理一个返回日期的后端,该日期分为一个日期和一个时间,存储为Integer值。例如,返回值可以是131006,它将转换为13:10:06。我知道此后端总是以 UTC 返回日期。我将其转换为字符串,然后使用以下代码将字符串转换为日期:

let timeFormatter = DateFormatter()
timeFormatter.dateFormat = "HHmmss"
timeFormatter.timeZone = TimeZone(identifier: "UTC")
let time = timeFormatter.date(from: "131006")

为了做一些检查,我在这段代码中写了一些打印语句。此处最重要的是print(timeFormatter.timeZone.abbreviation()),它返回 Optional("GMT") 。因为GMT == UTC,所以这很好并且符合预期。我还检查了时间值,该值返回2000-01-01 13:10:06 +0000,它仍然是预期的结果。

现在转到代码,然后使用所需的TimeZone将日期格式化为所需的String:
let timeToString = DateFormatter()
timeToString.dateFormat = "HH:mm"
timeToString.timeZone = TimeZone.current
let timeString = timeToString.string(from: time!)

在此代码中,我还打印了TimeZone.current.abbreviation())属性,该属性返回 Optional("GMT+2") ,这也是预期的结果。但是,当我们打印timeString变量的值时,输出为14:10,而不是15:10的预期结果。

我使用DateFormatter的方式有什么问题?谢谢!

最佳答案


let timeFormatter = DateFormatter()
timeFormatter.dateFormat = "HHmmss"
timeFormatter.timeZone = TimeZone(identifier: "UTC")
let time = timeFormatter.date(from: "131006")

仅提供时间,但不提供日/月/年。在这种情况下,日期格式化程序使用默认日期2001年1月1日,您可以通过
print(time!) // 2000-01-01 13:10:06 +0000

当天的夏令时未启用,因此
您在该时间点的本地时间是14:10,而不是15:10

要解决此问题,您可以组合日期和时间字符串
从服务器发送并进行解析,或转换日期字符串
首先,并在转换时间字符串时将其设置为默认日期:
timeFormatter.defaultDate = ...

关于ios - DateFormatter返回时区的意外日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49689671/

相关文章:

iphone - 更改方向时如何正确调整UIView的大小?

iphone - 从NSURL下载时如何处理无响应的UI

ios - 如何在UITextField中保存用户输入?

swift :使用没有值(value)的getter

regex - 什么是.WithTransparentBounds?

ios - 使用自动布局、键盘插入和横向旋转来配置 UIScrollView 内容

ios - pushViewController 没有 Action

ios - 我应该为每个要上传到 iTunesConnect 的新版本创建一个新的应用内购买吗?

swift - 无法在 Swift 中从 XCTest 打开 NSStream

objective-c - 什么描述了 NSNumberFormatter -maximumSignificantDigits?