日期字符串中的Z表示UTC。日期格式
我从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
为什么现在不是时候?
"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日期/时间字符串的两个选项:
使用不带"样式"的
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
。使用
ISO8601DateFormatter
:let formatter: ISO8601DateFormatter = { let formatter = ISO8601DateFormatter() formatter.formatOptions.insert(.withFractionalSeconds) return formatter }()