✅ weekStart(for:) 함수의 목적:
👉 주어진 날짜(date)가 속한 “주(week)”의 시작 요일(일요일)을 구하는 함수
예를 들어,
date = 2025-11-20 (목요일)이면
→ 그 주의 시작인 2025-11-16(일요일)을 반환해야 함
즉 "이 날짜는 이번 주의 어디에 속하느냐?"를 따지는 함수야.
func weekStart(for date: Date) -> Date {
let cal = calendar
// Calendar 방식 (1 ~ 7) 요일 index
let weekday = cal.component(.weekday, from: date)
// 일요일 = 1
let daysToSunday = (weekday - cal.firstWeekday + 7) % 7
return cal.date(byAdding: .day, value: -daysToSunday, to: date)!
}
🔥 핵심: (weekday - cal.firstWeekday + 7) % 7
이 식은:
👉 오늘이 주의 몇 번째 날인지 계산하는 공식
즉, “일요일을 기준으로 며칠 떨어져 있느냐?”
라고 보면 돼.
🧩 firstWeekday란?
iOS Calendar에서
firstWeekday = 1이면 → "일요일이 한 주의 시작"
즉,
1. 일요일이면 weekday = 1, firstWeekday = 1
→ 오늘은 주의 첫째 날
2. 금요일이면 weekday = 6, firstWeekday = 1
→ 오늘은 주의 6번째 날
📌 예시 1: date가 토요일(weekday=7)
daysToSunday = (7 - 1 + 7) % 7
= 13 % 7
= 6
뜻:
👉 토요일은 일요일보다 6일 뒤에 있는 날
그래서 “일요일까지 며칠 빼야 되나?”
→ 6일을 빼면 됨.
📌 예시 2: date가 금요일(weekday=6)
(6 - 1 + 7) % 7 = 12 % 7 = 5
👉 금요일은 일요일보다 5일 뒤에 있는 날
→ 금요일에서 -5일 하면 일요일
daysToSunday = 주의 첫날(일요일)까지 거슬러 올라가는 거리
return cal.date(byAdding: .day, value: -daysToSunday, to: date)!
1. date = 2025-11-20 (목)
2. daysToSunday = 4
-4일 → 2025-11-16(일요일)
즉:
👉 해당 주의 일요일 날짜를 반환!
📦 정리하면
weekStart(for:) 함수는:
1. date가 무슨 요일인지 분석하고
2. 그 요일이 일요일에서 얼마나 멀리 떨어져 있는지 계산한 뒤
3. 그만큼 날짜를 “뒤로 이동”해서
4. 그 주의 첫 번째 날(일요일)을 반환
하는 함수야.
🌈 그 다음 함수: weekRange(for:)
결론부터 말하면:
👉 일요일 ~ 토요일까지의 범위(DateInterval)를 만든다
func weekRange(for date: Date) -> DateInterval {
let start = weekStart(for: date)
let end = calendar.date(byAdding: .day, value: 6, to: start)!
return DateInterval(start: start, end: end)
}
해석:
1. start = 그 주의 일요일
2. end = start + 6일 → 토요일
3. DateInterval(start: 일요일, end: 토요일)
이제 한 주 전체 날짜 범위 객체가 된다.
'감정일기(가칭)' 카테고리의 다른 글
| 📘 MVVM에서 PassthroughSubject로 화면 이동 이벤트 처리하기 (0) | 2025.11.24 |
|---|---|
| 📅 Swift로 "주차(Week Number)" 계산하는 법 완전 정리 (0) | 2025.11.21 |
| ✅ 주간 (일 ~ 토) 날짜를 요일 enum으로 매핑해주는 함수 (0) | 2025.11.21 |
| Popover 위에 “어두운 배경(딤)” 깔고 싶다 (0) | 2025.11.19 |
| 📌 화면 진입 시 감정 선택창 자동 오픈하기, 저장 완료 후 화면 닫기 처리 (0) | 2025.11.18 |