-
[Swift] Date formatted, FormatStyle로 날짜 출력하기공부/iOS 2023. 7. 19. 16:50
formatted 소개
formatted는 날짜나 시간에 대해서 간편하게 문자열 형태로 생성하게 도와주는 인스턴스 메소드입니다.iOS15부터 지원하며 기존 swift에서 Date를 다루기 위해 사용해왔던 DateFormatter 보다 훨신 간단하게 날짜를 다룰 수 있습니다.
(ios App Dev tutorial로 UIKit 공부를 하다가 발견하여 공부하게 되었습니다.)
5번째 줄을 보면 formatted(date: .omitted, time: .shortened)로 사용된 것을 확인할 수 있는데요.
사용할 수 있는 옵션은 다음과 같습니다.
date(ko) date(us) abbreviated 2023년 7월 19일 Jan 17, 2021, complete 2023년 7월 19일 수요일 Sunday, January 17, long 2023년 7월 19일 January 17, 2021, numeric 7/19/2023 1/17/2021, omitted X X time(ko) time(us) complete 오후 2:54:54 GMT+9 4:03:12 PM CST shortened 수요일 오후 2:54 2021, 4:03 PM standard 오후 2:54:54 2021, 4:03:12 PM omitted X X 기존 dateFormatter를 선언해 어떻게 출력할지 직접 치지 않아도 간편하게 날짜를 출력할 수 있습니다.
만약 이 이외의 옵션이 필요한 경우에는 어떻게 될까요? 직접 만들면 됩니다!
FormatStyle 소개
포멧 만들기
FormatStyle은 날짜 인스턴스의 Locale에 해당하는 문자열을 생성하고,
날짜 및 시간 문자열을 날짜 인스턴스로 변환해주는 Struct 입니다.
순서나 포멧을 다르게 변경하고 싶다면 직접 커스텀하는 방법이 있습니다.
let myFormat = Date.FormatStyle() .year(.defaultDigits) .month(.abbreviated) .day(.twoDigits) .hour(.defaultDigits(amPM: .abbreviated)) .minute(.twoDigits) .timeZone(.identifier(.long)) .era(.wide) .dayOfYear(.defaultDigits) .weekday(.abbreviated) .week(.defaultDigits) .locale(Locale(identifier: "en_US")) print(date.formatted(myFormat)) // ko_KR: 서기 2023년 7월 19일 (수) (주: 29) 오후 3:54 Asia/Seoul // en_US: Wed, Jul 19, 2023 Anno Domini (week: 29) at 3:54 PM Asia/Seoul
Date.FormatStyle의 인스턴스를 전달하는 Date의 인스턴스에서 .formatted 메서드를 호출합니다.
깔끔하게 선언형 형태로 FormatStyle을 만들어 줄 수 있습니다.
위에서 formatted에서 사용하지 못했던 locale이나 timeZone을 쓸 수 있다는 점이 매력적이네요.
기존에 있었던 DateFormatter와 비슷한
Parsing Dates and Times
let inputString = "Archive for month 8, archived on day 23 - complete." let strategy = Date.ParseStrategy(format: "Archive for month \(month: .defaultDigits), archived on day \(day: .twoDigits) - complete.", locale: Locale(identifier: "en_US"), timeZone: TimeZone(abbreviation: "CDT")!) if let date = try? Date(inputString, strategy: strategy) { print(date.formatted()) // "Aug 23, 2000 at 12:00 AM" }
문자열 형태를 이렇게 쉽게 파싱이 가능하다니...
매번 알고리즘 문자열 문제 풀듯 직접 파싱했었는데 이렇게 간단한 방법이 있는줄 몰랐네요😱
입력이 문장 형태로 들어오더라도 이처럼 Date.ParseStrategy를 사용하면 특정 부분만 따올 수 있습니다.
또한 strategy에는 위에서 만들었던 FormatStyle를 사용할 수도 있습니다.
let dateString = Date().formatted(myFormat) // Wed, Jul 19, 2023 Anno Domini (week: 29) at 4:19 PM Asia/Seoul if let anniversary = try? Date(dateString, strategy: myFormat) { print(anniversary.formatted(date: .abbreviated, time: .shortened)) //2023년 7월 19일 오후 4:19 } else { print("Can't parse string into date with this format.") }
(위에서 만들었던 myFormat과 해당 결과를 재활용 해줍니다..)
만약 "Wed, Jul 19, 2023 Anno Domini (week: 29) at 4:19 PM Asia/Seoul"
이러한 형태로 문자열이 들어왔다면 해당하는 포멧에 맞게 Date를 파싱해줄 수 있습니다.
이렇게 간단하게 String 형태의 date 문자열을 손쉽게 Date 타입으로 파싱해줍니다.
정리
오늘 공부했던 formatter와 FormatStyle을 활용하면 Date 다루기가 정말 쉬울 것 같습니다.
특히나 Date() -> String, String -> Date() 과정이 너무 쉽게 가능해 놀랐습니다.
기존의 DateFormatter로 충분히 가능한 부분이지만 앞으로는 이와같은 선언형 형태의 코드로 점차 바뀌어나갈 것 같습니다!
여담으로 ios App Dev tutorial로 UIKit 공부를 하다 발견했던 내용이지만 이게 정말 튜토리얼이 맞나 싶네요 ㅋㅋㅋㅋ
처음보는 내용을 당연하다는듯 툭 던지고 넘어가는데 세렝게티 사자버전 튜토리얼인가봅니다😂
몰랐던 내용을 정리할겸 포스트를 오랜만에 작성해보았습니다.
이번건 정말 유용할 것 같아서 공유하고 싶었거든요.😁
'공부 > iOS' 카테고리의 다른 글
[UIKit]키보드 위에 수정 제안을 비활성화하기 (0) 2023.12.13 self에서 unexpected 에러가 발생하는 이유 (0) 2023.12.01 디자인 챌린지 (Asia Pacific) - Part 1 (0) 2023.03.06 Xcode 아이폰 빌드한 뒤에 LLDB 라고 하면서 빌드 안되는 문제 (0) 2022.11.28 Editing NavigationSplitView 예제에서 모르는 키워드 정리(작성중) (0) 2022.11.26