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

loganberry·2020년 10월 29일
1

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개의 댓글