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

👉 주어진 날짜(date)가 속한 “주(week)”의 시작 요일(일요일)을 구하는 함수 & 일요일 ~ 토요일까지의 범위(DateInterval)를 생성하는 함수

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

✅ 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: 토요일)

 

이제 한 주 전체 날짜 범위 객체가 된다.

728x90
LIST