【问题标题】:How to convert Server UTC Time to local time in Swift 4?如何在 Swift 4 中将服务器 UTC 时间转换为本地时间?
【发布时间】:2019-10-02 04:22:40
【问题描述】:

我尝试了一些类似的问题和答案,但仍然无法正常工作。 我正在尝试转换2019-09-30T09:10:32.537244Z

func serverToLocal(date:String) -> Date? {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-ddTHH:mm:ss.SSSSSSZ"
    dateFormatter.timeZone = TimeZone(abbreviation: "UTC")
    let localDate = dateFormatter.date(from: date)

    return localDate
}

上述方法总是返回 nil。我的日期格式有什么问题?

【问题讨论】:

  • 引用T"yyyy-MM-dd'T'HH:mm:ss.SSSSSSZ"。在这种情况下不需要设置格式化程序的timeZone,因为字符串提供了自己的时区信息。
  • @Daniel,我已经多次看到该帖子和其他帖子,但仍然无法正常工作。
  • @rmaddy,引用 T 仍然为零
  • timeZone 行替换为dateFormatter.locale = Locale(identifier: "en_US_POSIX")

标签: swift utc


【解决方案1】:

显然,关键问题是T 周围没有引号。

但是您可能不想在每次调用此例程时都实例化一个新的日期格式化程序(因为这是一个众所周知的计算量大的过程)。因此,您应该将日期格式化程序保存为属性。这样您就不需要为要转换为Date 的每个字符串实例化一个新的格式化程序。同样,此格式化程序可用于将日期转换回格式为 2019-09-30T09:10:32.537244Z 的字符串。

因此,与其他地方提供的建议相反,我建议设置格式化程序的timeZone。从字符串转换为日期时不需要它(因为日期字符串包含时区限定符),但是当从日期返回到字符串时,您确实需要日期格式化程序来指定时区,否则字符串表示日期将采用设备的本地时区。这样,您的格式化程序仍然适用于将字符串转换为日期以及返回字符串。

同样,我建议将 Z 替换为 ZZZZZ 或只是 X。同样,这仅在日期格式化程序也用于将日期转换回字符串时才至关重要(否则,生成的字符串将包含+0000 而不是Z)。最重要的是,我发现使用 X/ZZZZZ 意味着我永远不必担心它,当格式化程序将 2019-09-30T09:10:32.537244Z 转换为 Date 对象时它可以工作,反之亦然。

因此:

let iso8601DateFormatter: DateFormatter = {
    let formatter = DateFormatter()
    formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSX"
    formatter.timeZone = TimeZone(secondsFromGMT: 0)
    formatter.locale = Locale(identifier: "en_US_POSIX")
    return formatter
}()

func serverToLocal(string: String) -> Date? {
    return iso8601DateFormatter.date(from: string)
}

func localToServer(date: Date) -> String {
    return iso8601DateFormatter.string(from: date)
}

顺便说一句,您谈论的是“服务器”日期字符串。您是否通过 JSON 交换数据?如果您使用JSONEncoderJSONDecoder 解析JSON 中的字符串,您可以在编码器的dateEncodingStrategy 或解码器的dateDecodingStrategy 中使用格式化程序。这样,您的底层模型对象可以只是 Date 属性,并且 JSON 编码器/解码器将负责将 JSON 中的日期字符串转换为 Date 对象(并返回)。然后你就根本不需要这些serverToLocallocalToServer 方法了。


FWIW,有关引用 T、设置区域设置等的更多信息,请参阅 Apple 的 Technical Q&A 1480。它是旧文档,专注于 Objective-C,但它讨论了此处概述的概念。

【讨论】:

    猜你喜欢
    • 2017-08-05
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 2011-02-12
    • 2018-07-27
    • 2021-10-10
    相关资源
    最近更新 更多