ISO8601DateFormatter

ISO8601DateFormatter 에 대해서 간략히 알아본다.

들어가며..

iOS에서 시간 데이터를 관리하기 위해서는 Date 라는 타입을 이용하고 StringDate로 혹은 반대로 변환하기 위해서 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 명시할 때 실수는 많이 줄일 수 있을 것 같네요.

18 Shares:
답글 남기기

이메일 주소는 공개되지 않습니다.

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.

You May Also Like