mhe*_*gon 23 date ios swift swift3 ios10
我正在尝试解析这个问题
2017-01-23T10:12:31.484Z
使用ISO8601DateFormatter提供的本机类iOS 10但始终失败.如果字符串不包含毫秒,Date则创建对象时没有问题.
我试过这个和许多options组合,但总是失败...
let formatter = ISO8601DateFormatter()
formatter.timeZone = TimeZone(secondsFromGMT: 0)
formatter.formatOptions = [.withInternetDateTime, .withDashSeparatorInDate, .withColonSeparatorInTime, .withColonSeparatorInTimeZone, .withFullTime]
Run Code Online (Sandbox Code Playgroud)
任何的想法?谢谢!
vad*_*ian 51
在macOS之前,10.13/iOS 11 ISO8601DateFormatter不支持日期字符串,包括毫秒.
解决方法是使用正则表达式删除毫秒部分.
let isoDateString = "2017-01-23T10:12:31.484Z"
let trimmedIsoString = isoDateString.replacingOccurrences(of: "\\.\\d+", with: "", options: .regularExpression)
let formatter = ISO8601DateFormatter()
let date = formatter.date(from: trimmedIsoString)
Run Code Online (Sandbox Code Playgroud)
在macOS 10.13+/iOS 11+中,添加了一个新选项以支持小数秒:
static var withFractionalSeconds: ISO8601DateFormatter.Options { get }
let isoDateString = "2017-01-23T10:12:31.484Z"
let formatter = ISO8601DateFormatter()
formatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds]
let date = formatter.date(from: isoDateString)
Run Code Online (Sandbox Code Playgroud)
对于尚未准备好使用 iOS 11 的人,您始终可以创建自己的格式化程序来处理毫秒,例如:
extension DateFormatter {
static var iSO8601DateWithMillisec: DateFormatter {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
return dateFormatter
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
let formater = DateFormatter.iSO8601DateWithMillisec
let date = formater.date(from: "2017-01-23T10:12:31.484Z")!
print(date) // output: 2017-01-23 10:12:31 +0000
Run Code Online (Sandbox Code Playgroud)
它比编写正则表达式来从输入字符串中去除毫秒要稍微优雅一些。
也许这将有助于解码略有不同的格式:
extension JSONDecoder {
enum DateDecodeError: String, Error {
case invalidDate
}
static var bestDateAttemptDecoder: JSONDecoder {
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .custom({ (decoder) -> Date in
let container = try decoder.singleValueContainer()
if let dateSecs = try? container.decode(Double.self) {
return Date(timeIntervalSince1970: dateSecs)
}
if let dateSecs = try? container.decode(UInt.self) {
return Date(timeIntervalSince1970: TimeInterval(dateSecs))
}
let dateStr = try container.decode(String.self)
let isoFormatter = ISO8601DateFormatter()
isoFormatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds]
if let date = isoFormatter.date(from: dateStr) {
return date
}
isoFormatter.formatOptions = [.withInternetDateTime ]
if let date = isoFormatter.date(from: dateStr) {
return date
}
log.warning("Cannot decode date");
throw DateDecodeError.invalidDate
})
return decoder
}
}
Run Code Online (Sandbox Code Playgroud)
来自: https: //gist.github.com/th3m477/442a0d1da6354dd3b84e3b71df5dca6a
| 归档时间: |
|
| 查看次数: |
7976 次 |
| 最近记录: |