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
'감정일기(가칭)' 카테고리의 다른 글
| 🍋 UIKit에서 토스트 메시지(Toast Message) 구현하기 (0) | 2025.11.26 |
|---|---|
| 📘 MVVM에서 PassthroughSubject로 화면 이동 이벤트 처리하기 (0) | 2025.11.24 |
| 👉 주어진 날짜(date)가 속한 “주(week)”의 시작 요일(일요일)을 구하는 함수 & 일요일 ~ 토요일까지의 범위(DateInterval)를 생성하는 함수 (0) | 2025.11.21 |
| ✅ 주간 (일 ~ 토) 날짜를 요일 enum으로 매핑해주는 함수 (0) | 2025.11.21 |
| Popover 위에 “어두운 배경(딤)” 깔고 싶다 (0) | 2025.11.19 |