[Swift] 날짜와 시간 다루기 - 2 (feat. DateFormatter, DateComponents)

Logan·2020년 10월 29일
2

2222년 2월 22일 만들기

Date 형식으로 현재 날짜의 값을 가진 인스턴스를 생성할 수 있습니다.
[Swift] 날짜와 시간 다루기 - 1 링크

let now = Date() // 현재(인스턴스를 생성한) 날짜

만약 어떤 특정 날짜를 만들고 싶다면, DateComponents를 활용하면 됩니다.

단계 1

DateComponents(calendar: Calendar?, timeZone: TimeZone?, era: Int?, year: Int?, month: Int?, day: Int?, hour: Int?, minute: Int?, second: Int?, nanosecond: Int?, weekday: Int?, weekdayOrdinal: Int?, quarter: Int?, weekOfMonth: Int?, weekOfYear: Int?, yearForWeekOfYear: Int?)

DateComponents 생성자 파라미터의 자료형을 보면 Optional입니다.
그래서 모든 파라미터를 전달하지 않더라도, 기본값이 nil이기 때문에 원하는 파라미터만 골라서 사용할 수 있습니다.

let myDateComponents = DateComponents(year: 2222, month: 2, day: 22)
let calendar = Calendar.current
let myDate = calendar.date(from: myDateComponents) // "Feb 22, 2222 at 12:00 AM"

DateComponents 형식을 사용해, 필요한 요소만 골라 myDateComponents 인스턴스를 생성했습니다.
이렇게 바로 Date로 사용하면 정말 편했겠지만, DateComponents 형식을 사용했기 때문에 당연히 Type도 DateComponents입니다. 날짜로 사용하려면 Date 형식으로 바꿔주어야 합니다.

어떤 달력을 기준으로 날짜를 만들어야 하는지 알아야 하기 때문에, Calendar 인스턴스를 생성해주고, Calendar 형식이 제공하는 date(from:) 메소드를 활용해 원하는 날짜를 만들어줬습니다.

func date(from components: DateComponents) -> Date?

Calendar 형식이 제공하는 date(from:) 메소드를 보면, 파라미터로 DateComponents 형식을 전달해야합니다. 그래서 아까 만들어둔 myDateComponents 인스턴스를 전달할 수 있었습니다. 지정한 Components를 토대로 Date?를 리턴해줍니다.


단계 2

"Feb 22, 2222 at 12:00 AM"

날짜를 생성했지만 원하는 Format이 아닙니다.
정하지 않은 시간이 기본값으로 입력되었고, 영어에 순서도 뒤죽박죽입니다.
위에 만들어둔 코드에 DateFormatter를 사용하면 이쁘게 다듬을 수 있습니다.

let myDateComponents = DateComponents(year: 2222, month: 2, day: 22)
let calendar = Calendar.current
let myDate = calendar.date(from: myDateComponents)

let dateFormat = DateFormatter()
dateFormat.locale = Locale(identifier: "ko_kr")
dateFormat.dateStyle = .long
dateFormat.string(for: myDate) // "2222년 2월 22일"

DateFormatter 형식으로 인스턴스를 생성하고 순차적으로 코드를 따라, locale 속성부터 "ko_kr"(한국)(으)로 설정해주었습니다.
dateStyle은 .long으로 지정해주었습니다. 시간은 사용하지 않았기 때문에 .timeStyle은 생략했습니다.
마지막으로 .string(for:)에 myDate를 전달하면 원하는 날짜 문자열을 얻을 수 있습니다.

.dateStyle은 날짜의 스타일을 지정해줄 수 있습니다. .short, .long 등 길이로 지정할 수 있고 기본값은 .none이기 때문에 지정해주지 않는다면 빈 문자열이 나옵니다.

profile
iOS개발자 꿈나무

0개의 댓글