자주 간과되는 문제는 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)
들어 아이폰 OS 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 기사 를 확인하는 것이 좋습니다 .