經常忽略的一個問題是,在ISO 8601的字符串格式可能毫秒可能不會。
換句話說,「2016-12-31T23:59:59.9999999」和「2016-12-01T00:00:00」都是合法的,但是如果您使用的是靜態類型日期格式化程序,其中一個贏得了不會被解析。
我還沒有找到答案,涵蓋了這兩個案件和摘要了這種微妙的差異。下面是解決它的解決方案:
extension DateFormatter {
static let iso8601DateFormatter: DateFormatter = {
let enUSPOSIXLocale = Locale(identifier: "en_US_POSIX")
let iso8601DateFormatter = DateFormatter()
iso8601DateFormatter.locale = enUSPOSIXLocale
iso8601DateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
iso8601DateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
return iso8601DateFormatter
}()
static let iso8601WithoutMillisecondsDateFormatter: DateFormatter = {
let enUSPOSIXLocale = Locale(identifier: "en_US_POSIX")
let iso8601DateFormatter = DateFormatter()
iso8601DateFormatter.locale = enUSPOSIXLocale
iso8601DateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss'Z'"
iso8601DateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
return iso8601DateFormatter
}()
static func date(fromISO8601String string: String) -> Date? {
if let dateWithMilliseconds = iso8601DateFormatter.date(from: string) {
return dateWithMilliseconds
}
if let dateWithoutMilliseconds = iso8601WithoutMillisecondsDateFormatter.date(from: string) {
return dateWithoutMilliseconds
}
return nil
}
}
用法:
let dateToString = "2016-12-31T23:59:59.9999999"
let dateTo = DateFormatter.date(fromISO8601String: dateToString)
// dateTo: 2016-12-31 23:59:59 +0000
let dateFromString = "2016-12-01T00:00:00"
let dateFrom = DateFormatter.date(fromISO8601String: dateFromString)
// dateFrom: 2016-12-01 00:00:00 +0000
我也建議檢查Apple article關於日期的格式化。
我猜短的是在旁觀者的眼中。三行代碼很短,不是嗎?有一個C NSDate子類,你可以添加一行代碼,我只是絆倒它:https://github.com/soffes/SAMCategories/tree/master/SAMCategories/Foundation。這就是說,真的,你有很好的答案(恕我直言),你應該獎勵艾蒂安或rmaddy的答案。它只是良好的做法和獎勵人們提供真正有用的信息(它幫助了我,我今天需要這個信息)。艾蒂安可以使用比rmaddy更多的分數。作爲一個很好的衡量標誌,我甚至會爲你的問題投票! – 2013-11-13 18:57:35