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

标签 ios swift foundation dateformatter

我已经阅读了多篇关于此的文章,其中大部分是由于未设置特定时区而系统获取了当前时区。我的场景略有不同并给出了意想不到的结果,所以我会尝试详细解释。

我正在处理一个返回日期的后端,该日期分为日期和时间,存储为整数值。例如,返回值可以是 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,这仍然是预期的结果。

现在转到代码,然后我将该日期格式化为所需的字符串,并带有所需的时区:

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/

相关文章:

ios - 具有 EasyIn 动画,然后按顺序缩放动画,因为缩放动画会永远重复

ios - 如何将WebRTC导入到xcode项目中?

ios - NSEntityDescription 仅在 iPad Air 7.1 上返回 nil

ios - Swift 和 Foundation 的关系

ios - AIR 3.6 iOS - 使用 ABC 加载外部 SWF

ios - UIImageView 在设备上的启动屏幕中缺少图像

swift - 为什么写acos(1.0)可以,写acos(1)不行?

string - 使用 ||对于 swift 中 if 语句中的多个字符串

iOS PDF 到纯文本解析器

ios - 没有这样的模块 'Parse'/'Bolts'