【问题标题】:Format yyyy-MM-dd'T'HH:mm:ss.SSSZ swift not work格式 yyyy-MM-dd'T'HH:mm:ss.SSSZ swift 不起作用
【发布时间】:2020-11-17 22:41:27
【问题描述】:

我从 json 得到以下格式,特别是我得到的两种格式:

  "createdAt":"2020-09-21T18:24:36.787Z",

  "createdAt":"2020-09-21T18:45:05.250Z",

我使用了这种格式:

    lazy var formatter: DateFormatter = {
    let formatter = DateFormatter()
    formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
    formatter.timeZone = TimeZone(abbreviation: "UTC+8")
    formatter.locale = Locale.current
    formatter.dateStyle = .medium
    formatter.timeStyle = .none
    return formatter
}()

然而,应用程序只给我回:

Sep 22, 2020
Sep 22, 2020

为什么不是时候?

【问题讨论】:

    标签: ios swift date formatter


    【解决方案1】:

    您的日期字符串中的 Z 表示 UTC 您的 dateFormat 中的 "Z" "yyyy-MM-dd'T'HH:mm:ss.SSSZ" 会将其解释为 UTC。您将日期格式化程序设置为哪个时区并不重要。只有从日期获取字符串时才会有所不同。顺便说一句,在解析固定日期格式时,在设置 dateFormat 之前,您应该始终将 dateFormatter 语言环境设置为“en_US_POSIX”。

    此外,您不能同时使用 dateFormat 和日期/时间样式。这是其中之一。

    let formatter: DateFormatter = {
        let formatter = DateFormatter()
        formatter.locale = .init(identifier: "en_US_POSIX")
        formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
        formatter.timeZone = TimeZone(secondsFromGMT: 0)
        return formatter
    }()
    
    if let date = formatter.date(from: "2020-09-21T18:24:36.787Z") {
        print(date.description(with: .current))  // Monday, 21 September 2020 15:24:36 Brasilia Standard Time
        let dateString = formatter.string(from: date)
        print("date:", dateString)
    }
    

    这将打印:

    巴西利亚标准时间 2020 年 9 月 21 日星期一 15:24:36
    日期:2020-09-21T18:24:36.787+0000


    如果您需要向用户显示本地化日期,请查看post

    【讨论】:

      【解决方案2】:

      构建和解析 ISO 8601/RFC 3339 日期/时间字符串的两个选项:

      1. 使用不带“样式”的DateFormatter,但为时区指定X

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

        具有讽刺意味的是,请注意X 而不是Z,以确保当您从日期构建字符串时,时区显示为Z 而不是+0000

      2. 使用ISO8601DateFormatter

        let formatter: ISO8601DateFormatter = {
            let formatter = ISO8601DateFormatter()
            formatter.formatOptions.insert(.withFractionalSeconds)
            return formatter
        }()
        

      【讨论】:

        猜你喜欢
        • 2013-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-24
        • 1970-01-01
        • 1970-01-01
        • 2019-10-20
        • 2014-10-16
        相关资源
        最近更新 更多