ปัญหาที่มักถูกมองข้ามคือสตริงในรูปแบบ ISO 8601 อาจมีหน่วยมิลลิวินาทีและอาจไม่มี
กล่าวอีกนัยหนึ่งทั้ง "2016-12-31T23: 59: 59.9999999" และ "2016-12-01T00: 00: 00" เป็นสิ่งที่ถูกต้อง แต่ถ้าคุณใช้ตัวจัดรูปแบบวันที่แบบคงที่ระบบจะไม่แยกวิเคราะห์รายการใดรายการหนึ่ง .
ตั้งแต่iOS 10คุณควรใช้ISO8601DateFormatter
ที่จัดการสตริงวันที่ ISO 8601 รูปแบบต่างๆ ดูตัวอย่างด้านล่าง:
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)
สำหรับiOS 9 และต่ำกว่าให้ใช้แนวทางต่อไปนี้กับรูปแบบข้อมูลหลายรูปแบบ
ฉันยังไม่พบคำตอบที่ครอบคลุมทั้งกรณีและนามธรรมที่แตกต่างกันเล็กน้อยนี้ นี่คือวิธีแก้ปัญหาที่กล่าวถึง:
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เกี่ยวกับรูปแบบวันที่