Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

개발자의 삽질

[iOS] ISO8601DateFormatter 를 이용해 날짜 데이터를 문자로 바꾸어보자! 본문

iOS

[iOS] ISO8601DateFormatter 를 이용해 날짜 데이터를 문자로 바꾸어보자!

uniqueimaginate 2022. 2. 9. 23:46

https://developer.apple.com/documentation/foundation/iso8601dateformatter

 

Apple Developer Documentation

 

developer.apple.com


개발을 하다가 데이트 피커에서 날짜를 받아서 문자로 바꾸어줘야 할 일이 있었다.

서버에서 요구하는 포맷이 ISO8601 이었기 때문에 ISO8601DateFormatter 를 사용해보았다.

ISO8601DateFormatter 는 Date <-> String 이 모두 가능하지만 여기서는 Date -> String 만 다루겠다.

ISO8601DateFormatter 를 이용하기 위해서는 3가지의 변수가 필요하다.

  1. Date
  2. TimeZone
  3. ISO8601DateFormatter.Options
    • 총 14개의 옵션이 있다.
    • 이 중 .withFractionalSeconds만 iOS 11.0 이상부터 사용가능 하며, 나머지는 10.0이상부터 사용 가능하다
    • .withYear, .withMonth, .withWeekOfYear, .withDay, .withTime, .withTimeZone, .withSpaceBetweenDateAndTime, .withDashSeparatorInDate, .withColonSeparatorInTimeZone, .withFullDate, .withFullTime, .withInternetDateTime, .withFractionalSeconds

바로 예시로 간다.

// 먼저 Date()를 통해 현재 시간을 받는다.
let date = Date()

// TimeZone은 Optional Type을 반환하기 때문에 if let 을 이용해서 Optional 처리를 해준다.
if let timezone = TimeZone(abbreviation: "KST"){
    let dateString = ISO8601DateFormatter.string(from: date,
                                                 timeZone: timezone,
                                                 formatOptions: [.withInternetDateTime])
    print(dateString)
}

// 결과: 2022-02-09T23:16:49+09:00

위의 코드를 부연설명하자면

TimeZone에 있는 abbreviation은 시간대를 나타낸다.

현재 한국 표준시의 영어 약칭이 KST 이기 때문에 KST를 넣어주었다.

다른 나라의 약칭을 보려면 다음의 URL 을 따라가길 바란다.

이제 ISO8601DateFormatter.string(from: , timeZone: , formatOptions: ) 함수에 변수를 각각 넣어준다.

마지막 formatOptions 에는 위에 적어둔 옵션들 중 원하는 것을 선택해서 배열로 주면 된다.

 

주의

.withYear, .withMonth, .withWeekOfYear, .withDay, .withTime, .withTimeZone, .withSpaceBetweenDateAndTime, .withDashSeparatorInDate, .withColonSeparatorInTime, .withFractionalSeconds

 

위 옵션들은 단독으로 사용하게 되면 아무런 결과를 주지 않는다!!!

왜냐고 물으면 나도 모른다!!!! 프로젝트 상에서 단독으로 넣어보고 플레이그라운드에서도 넣어봤는데 아무것도 반환을 안하는걸 어떡하냐!!! 이것 때문에 계속 삽질했다!!!!!!!

 

따라서 경험적으로 사용을 해야 한다.

 

한가지 알려줄 것이 있다면

.withFullDate, .withFullTime, .withInternetDateTime 이 3가지 옵션 중 하나를 선택하고 나머지 위의 옵션들을 선택해야지만 결과를 보여준다.

 

.withFullDate (날짜)

결과: 2022-02-09

 

.withFullTime (시:분:초+타임존)

결과: 23:37:19+09:00

 

.withInternetDateTime (날짜 + 'T' + 시:분:초 + 타임존)

결과: 2022-02-09T23:37:44+09:00

 

추가 예시

.withFullDate, .withTime (날짜 + 'T' + 시분초(사이에 콜론 없음))

결과: 2022-02-09T233822

 

.withFullDate, .withTime, .withColonSeparatorInTime (날짜 + 'T' + 시:분:초)

결과: 2022-02-09T23:38:22

 

.withFullDate, .withTimeZone (날짜 + 타임존)

결과: 2022-02-09+0900

 

.withInternetDateTime, .withFractionalSeconds (날짜 + 'T' + 시:분:초.밀리초 + 타임존)

결과: 2022-02-09T23:41:27.276+09:00

 

.withFullDate, .withFullTime, .withSpaceBetweenDateAndTime (날짜 + 공백 + 시:분:초.밀리초 + 타임존)

결과: 2022-02-09 23:43:07+09:00

Comments