들어가며..
iOS에서 시간 데이터를 관리하기 위해서는 Date
라는 타입을 이용하고 String
을 Date
로 혹은 반대로 변환하기 위해서 DateFormatter
를 이용하는 것이 오랜 관습처럼 여겨지고 있습니다.
iOS10 부터는 ISO8601DateFormatter
클래스가 추가되어 iso8601 표준 포맷을 더 쉽게 다룰 수 있게 되었습니다.
ISO8601DateFormatter
클래스 인터페이스는 아래 문서에서 볼 수 있습니다.
https://developer.apple.com/documentation/foundation/iso8601dateformatter
사용법은 format
형태가 문자열이 아닌 option
형태입니다.
let string = "20200601"
let formatter8601 = ISO8601DateFormatter()
formatter8601.formatOptions = [.withYear, .withMonth, .withDay]
let date = formatter8601.date(from: string)
print(date.debugDescription)
이렇게 했을 때 디버그 창에는 Optional(2020-06-01 00:00:00 +0000)
결과가 나타납니다.
.with
으로 시작하는 옵션이 많이 존재하는데 아직 주석이 달리진 않았네요.. (애플 일해라!)
하지만 옵션명만 보면 대충 어떤 format
을 의미하는지는 쉽게(?) 아실 수 있을 겁니다.
JSON Encoder, Decoder strategy
JSONEncoder
/ JSONDecoder
에도 관련하여 date strategy
에 .iso8601
이 추가되었습니다.
하지만 miliseconds
가 포함된 문자열은 처리가 안되는 문제가 있습니다. 이럴 때는 아래처럼 custom
형태로 맞추어서 대입해주어야 합니다.
extension DateFormatter {
static let iso8601fraction: ISO8601DateFormatter = {
let formatter = ISO8601DateFormatter()
formatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds]
formatter.timeZone = TimeZone.autoupdatingCurrent
return formatter
}()
}
결론
DateFormatter
가 편하시면 그대로 써도 무방합니다만 이런 것도 있다는 것쯤으로 알아두셔도 좋을 것 같습니다. 최소한 문자열로 format
명시할 때 실수는 많이 줄일 수 있을 것 같네요.