Một vấn đề thường bị bỏ qua là các chuỗi ở định dạng ISO 8601 có thể có mili giây và có thể không.
Nói cách khác, cả "2016-12-31T23: 59: 59.9999999" và "2016-12-01T00: 00: 00" đều hợp pháp, nhưng nếu bạn đang sử dụng bộ định dạng ngày được nhập tĩnh, một trong số chúng sẽ không được phân tích cú pháp .
Bắt đầu từ iOS 10, bạn nên sử dụng ISO8601DateFormatter
nó xử lý tất cả các biến thể của chuỗi ngày ISO 8601. Xem ví dụ bên dưới:
let date = Date()
var string: String
let formatter = ISO8601DateFormatter()
string = formatter.string(from: date)
let GMT = TimeZone(abbreviation: "GMT")
let options: ISO8601DateFormatOptions = [.withInternetDateTime, .withDashSeparatorInDate, .withColonSeparatorInTime, .withTimeZone]
string = ISO8601DateFormatter.string(from: date, timeZone: GMT, formatOptions: options)
Đối với iOS 9 trở xuống, hãy sử dụng phương pháp sau với nhiều định dạng dữ liệu.
Tôi đã không tìm thấy câu trả lời bao hàm cả hai trường hợp và tóm tắt sự khác biệt nhỏ này. Đây là giải pháp giải quyết nó:
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
}
}
Sử dụng:
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
Tôi cũng khuyên bạn nên kiểm tra bài viết của Apple về bộ định dạng ngày.