# Calendar 구조체 다루기

Date 인스턴스는 특정 시점을 기준으로 지금까지 흐른 시간을 초 단위로 계산한 데이터를 나타낸다. 이를 실생활에서 사용하는 문자열 표기나 날짜로 표기하기 위해서는 Calendar 구조체나 DateFormatter 클래스를 사용해야 한다.

Calendar 구조체의 인스턴스를 생성하는 일반적인 방법은 아래와 같다.

var calendar = Calendar.current
// 또는 기기 자체설정 달력
var calendar = Calendar.autoupdatingCurrent

Calendar 자체적으로 달력 환경에 따른 생성자를 제공하기도 하지만 Calendar.current을 통해 그레고리안 태양력을 사용할 수 있다.

캘린더는 지역 및 타임존 설정이 필요하다. 타임존은 시차 설정을 위해 필요하고, 지역설정은 달력의 지역별 맞춤 표기를 위해 필요하다.

calendar.locale = Locale(identifier: "ko_KR") // 굳이 안해줘도 됨

# 캘린더에서 날짜 뽑아내기

캘린더에서 년/월/일/시/분/초를 뽑아내기 위해서는 캘린더 인스턴스의 component메서드를 호출하여 Calendar타입 내의 열거형 케이스를 지정해주면 된다.

let year: Int = calendar.component(.year, from: now)
let month: Int = calendar.component(.month, from: now)
// ...

component메서드는 요소 하나만 뽑을때 사용하고 여러 요소를 한번에 뽑아 사용하기 위해서는 dateComponents 메서드를 호출한다.

var date = calendar.dateComponents([.year, .month, .day], from: now)

date.year
date.month
date.day

# DateFormatter 활용

Date를 문자열 형태로 형식을 지정하여 출력하기 위해 사용한다. DateFormatter는 변환을 위한 객체 생성 후 형식 지정 몇가지가 필요하다.

  1. 지역 설정
  2. 시간대 설정
  3. 날짜형식 설정
  4. 시간형식 설정
// 객체 생성
let formatter = DateFormatter()

// 1. 지역 설정
formatter.locale = Locale(identifier: "ko_KR")

// 2. 시간대 설정
formatter.timeZone = TimeZone.current

// 3. 날짜 형식 지정
formatter.dateStyle = .full

// 4. 시간 형식 지정
formatter.timeStyle = .full

// 커스텀 형식으로 스타일 지정 가능
formatter.dateFormat = "yyyy년 MMMM d일 (E)"

// 출력은 string메서드를 통해!
print(formatter.string(from: Date()))
newFormatter.date(from: "2021/07/12")! // 옵셔널

DateFormatter 객체의 dateStyle, timeStyle 속성은 여러가지 열거형이 존재한다. 원하는 형식은 구글링하기

dateFormatter 객체의 string메서드를 통해 Date 인스턴스를 문자열로 형식 지정 후 출력하는 방법이 있었는데, 그 반대의 경우도 가능하다. (dateStyle먼저 지정 후 dateFormatter 객체의 date 메서드를 호출)

DateComponents 구조체

var components = DateComponents()    // 구조체 (날짜/시간의 요소들을 다룰 수 있는)
components.year = 2021
components.month = 1
components.day = 1

components.hour = 12
components.minute = 30
components.second = 0

let specifiedDate: Date = Calendar.current.date(from: components)!
print(specifiedDate)

캘린더의 dateComponents 메서드의 역방향이라고 보면된다. dateComponents메서드는 get하는 것이고 DateComponents 인스턴스의 생성은 set임

# Reference

  1. 인프런 - 앨런 swift 문법 마스터 스쿨 (opens new window)