DateFormatter:dateFormat 毫秒 Swift
DateFormatter: dateFormat milliseconds Swift
我正在编写 DateFormatter
的 dateFormat
以将 JSON 从服务器转换为本地 swift 对象。
服务器将 return 关注。
- 2018-10-07T15:26:33.236Z
- 2018-10-07T15:26:33Z
- 2018-10-07T15:26:33.26Z
以下是我的代码,但我不确定是否可以只写一行而不是 switch-case 条件(从 SWITCH-CASE START 到 END)。
无论returned 时间是否有毫秒,一个dateFormat
是最理想的。
任何建议表示赞赏。
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .custom{
let container = try [=11=].singleValueContainer()
let dateStr = try container.decode(String.self)
let formatter = DateFormatter()
formatter.calendar = Calendar(identifier: .gregorian)
formatter.locale = .current
// *** SWITCH-CASE: START ***
switch dateStr.utf8.count {
case 20:
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
case 22:
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SZ"
case 23:
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSZ"
case 24:
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
default:
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
}
// *** SWITCH-CASE: END ***
formatter.timeZone = TimeZone(secondsFromGMT: 0)
return formatter.date(from: dateStr)!
}
实际上检查日期字符串是否包含句点就足够了
if dateStr.contains(".") {
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SZ"
} else {
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
}
或者使用 ISO8601DateFormatter
并使用正则表达式删除毫秒,这也避免了指定 calendar
、locale
和 timezone
let formatter = ISO8601DateFormatter()
let trimmedDateStr = dateStr.replacingOccurrences(of: "\.\d+", with: "", options: .regularExpression)
return formatter.date(from: trimmedDateStr)!
我正在编写 DateFormatter
的 dateFormat
以将 JSON 从服务器转换为本地 swift 对象。
服务器将 return 关注。
- 2018-10-07T15:26:33.236Z
- 2018-10-07T15:26:33Z
- 2018-10-07T15:26:33.26Z
以下是我的代码,但我不确定是否可以只写一行而不是 switch-case 条件(从 SWITCH-CASE START 到 END)。
无论returned 时间是否有毫秒,一个dateFormat
是最理想的。
任何建议表示赞赏。
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .custom{
let container = try [=11=].singleValueContainer()
let dateStr = try container.decode(String.self)
let formatter = DateFormatter()
formatter.calendar = Calendar(identifier: .gregorian)
formatter.locale = .current
// *** SWITCH-CASE: START ***
switch dateStr.utf8.count {
case 20:
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
case 22:
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SZ"
case 23:
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSZ"
case 24:
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
default:
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
}
// *** SWITCH-CASE: END ***
formatter.timeZone = TimeZone(secondsFromGMT: 0)
return formatter.date(from: dateStr)!
}
实际上检查日期字符串是否包含句点就足够了
if dateStr.contains(".") {
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SZ"
} else {
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
}
或者使用 ISO8601DateFormatter
并使用正则表达式删除毫秒,这也避免了指定 calendar
、locale
和 timezone
let formatter = ISO8601DateFormatter()
let trimmedDateStr = dateStr.replacingOccurrences(of: "\.\d+", with: "", options: .regularExpression)
return formatter.date(from: trimmedDateStr)!