Calendar의 date(bySetting:value:of:) 함수를 이용할 때 주의점

Calendar의 date(bySetting:value:of:) 함수를 이용할 때 주의점

swift에서 날짜를 다룰 때 주로 Calendar struct를 이용하는데 날짜를 1일로 설정하기 위해서 date(bySetting:value:of:)를 이용했다.

// 현재 날짜 11월 29일
// 원하는 날짜 11월 1일

let calendar = Calendar.current
let firstDay = calendar.date(bySetting: .day, value: 1, of: Date()) // 12월 1일

글쓰는 현재가 2023년 11월 29일 이니까 firstDay는 2023년 11월 1일이 될걸로 기대했다. 그러나 firstDay는 2023년 12월 1일이다.

애플 공식 문서를 보니 내가 세팅하고자 하는 date component(나의 경우는 day)를 setting하는 개념이 아니라 find하는 개념인 것 같다. 따라서 찾는 방향이 backward일 수도 있고, forward일 수도 있다. (근데 왜 bySetting 일까..?)

따라서 더 정확하게 date를 설정하고자 한다면 nextDate(after:matching:matchingPolicy:behavior:direction:)를 사용하라고 한다.

// 현재 날짜 11월 29일
// 원하는 날짜 11월 1일

let calendar = Calendar.current
let targetComponents = DateComponents(day: 1)
let firstDay = calendar.nextDate(after: Date(), matching: targetComponents, matchingPolicy: .strict, direction: .backward) // 11월 1일