格式 yyyy-MM-dd'T'HH:mm:ss.SSSZ 斯威夫特不起作用



我从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

为什么现在不是时候?

日期字符串中的Z表示UTC。日期格式"yyyy-MM-dd'T'HH:mm:ss.SSSZ"中的"Z"将其解释为UTC。您将日期格式化程序设置为哪个时区并不重要。只有当从date中获取字符串时,它才会产生影响。Btw您应该始终将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:36787+0000


如果您需要向用户显示本地化日期,请检查此张贴

构建和解析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
    }()
    

相关内容

  • 没有找到相关文章

最新更新