본문 바로가기
감정일기(가칭)

📅 Swift로 "주차(Week Number)" 계산하는 법 완전 정리

by 밤새는 탐험가89 2025. 11. 21.
728x90
SMALL

기준 월(baseMonth) 안에서 특정 날짜(date)가 몇 번째 주인지 구하는 방법

 

주간 요약 기능, 달력, 감정분석 UI를 만들다 보면
“이 날짜는 이번 달의 몇 번째 주인가?”
를 계산해야 할 때가 많다.

 

이를 정확하게 계산하는 함수가 아래와 같은 구조다:


🧩 주차 계산 함수

func weekNumber(for date: Date, inMonth baseMonth: Date) -> Int {
    let cal = calendar
    let monthStart = cal.startOfMonth(for: baseMonth)
    let firstWeekStart = weekStart(for: monthStart)
    let currentWeekStart = weekStart(for: date)

    let diff = cal.dateComponents([.weekOfYear],
                                  from: firstWeekStart,
                                  to: currentWeekStart).weekOfYear ?? 0

    return diff + 1
}

 

1️⃣ monthStart — 기준 월의 1일을 만든다

let monthStart = cal.startOfMonth(for: baseMonth)

 

예:
baseMonth = 2025-11-20
→ monthStart = 2025-11-01

 

이제 “11월이라는 월 범위”의 계산을 시작할 수 있게 됨.

 

2️⃣ firstWeekStart — 기준 월의 첫 번째 주의 시작일(일요일)을 찾는다

let firstWeekStart = weekStart(for: monthStart)

 

예:
2025-11-01은 토요일
→ 이 날짜가 속한 주의 일요일 = 2025-10-26
→ 따라서 11월의 첫 주는
10/26 ~ 11/1

 

이 계산이 중요한 이유는,
달력의 "1주차"는 무조건 1일로 시작하는 게 아니라
“그 달의 1일이 포함된 주 전체”가 기준이기 때문이다.

 

3️⃣ currentWeekStart — 분석하려는 날짜의 주 시작일

let currentWeekStart = weekStart(for: date)

 

예:
date = 2025-11-20(목)
→ 이 날짜가 속한 주의 일요일 = 2025-11-16

 

4️⃣ diff 계산 — 두 주 사이의 차이(거리)

let diff = cal.dateComponents([.weekOfYear],
                              from: firstWeekStart,
                              to: currentWeekStart).weekOfYear ?? 0

 

예:
firstWeekStart = 2025-10-26
currentWeekStart = 2025-11-16

 

두 날짜는 3주 차이 → diff = 3

 

5️⃣ +1 — 0 기반 index → 사람 기준 주차 변환

Swift의 계산은 0부터 시작하므로
1주차 = diff + 1

return diff + 1

 

대표 날짜 weekStart  주차
2025-11-01 10/26 1주차
2025-11-08 11/2 2주차
2025-11-15 11/9 3주차
2025-11-20 11/16 4주차
2025-11-29 11/23 5주차
728x90
LIST