【问题标题】:DateFormatter returns unexpected date for TimezoneDateFormatter 返回时区的意外日期
【发布时间】:2018-09-16 07:08:50
【问题描述】:

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

我正在处理一个后端,它返回的日期分为日期和时间,存储为整数值。例如,返回值可以是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 的方式有什么问题?谢谢!

【问题讨论】:

    标签: ios swift foundation dateformatter


    【解决方案1】:

    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 = ...
    

    【讨论】:

    • 正确的传说!很长一段时间以来,我一直在为此头疼。感谢您的回答,我的问题已经解决了!
    猜你喜欢
    • 1970-01-01
    • 2021-12-24
    • 2018-10-13
    • 1970-01-01
    • 2011-12-27
    相关资源
    最近更新 更多