주차(Week Number)를 날짜 범위로 변환하는 방법 — 완전 가이드
누군가 일정표를 보냅니다. “W23에 배송.” 달력을 열고 멈칫합니다. 정확히 어떤 날짜들이지?
주차는 프로젝트 계획, 제조, 리테일, 물류에서 흔하게 쓰이지만, 대부분은 라벨로만 알고 있습니다. 주차를 다시 실제 달력 날짜로 되돌리는 건 생각보다 직관적이지 않고, 연말·연초 경계 케이스는 숙련된 개발자도 자주 헷갈립니다.
이 가이드는 전체 변환을 다룹니다: 주차→월요일, 주차→전체 날짜 범위(월–일), 그리고 반대로(날짜→주차). Python, JavaScript, Excel, SQL 코드까지 포함합니다.
주차가 실제로 알려주는 것
계산을 시작하기 전에, 그 주차가 어떤 주 번호 체계에서 나온 것인지 알아야 합니다.
ISO 8601(국제 표준): 1주는 그 해의 첫 번째 목요일을 포함하는 주입니다. 주는 월요일부터 일요일까지입니다. 한 해는 52주 또는 53주(ISO 주)로 구성됩니다. 중요한 점은 ISO 주의 “주-연도(week year)”가 달력 연도와 다를 수 있다는 것입니다. 12월 말 며칠이 다음 해의 1주에 속하기도 합니다.
미국식(US-style): 1주는 1월 1일을 포함하는 주입니다. 도구에 따라 주가 일요일–토요일 또는 월요일–일요일로 시작할 수 있습니다. 1월 1일은 예외 없이 항상 1주에 속합니다.
이 가이드에서 “주차”는 별도 언급이 없으면 ISO 8601을 의미합니다. 만약 미국 기반 도구(예: 기본 Excel WEEKNUM)에서 나온 주차라면 변환 공식이 다릅니다 — 아래 섹션을 참고하세요.
또 하나: 연도가 필요합니다. “23주”는 연도 없이 의미가 없습니다. 주차는 항상 (연도, 주)의 쌍으로 다뤄야 합니다. 2025년의 23주는 6월 2일에 시작하고, 2026년의 23주는 6월 1일에 시작합니다. 2026년의 1주는 2025년 12월 29일에 시작합니다.
핵심 공식: ISO 주차에서 월요일 구하기
모든 ISO 주는 월요일에 시작합니다. 연도 Y의 ISO 주 W의 월요일을 구하려면:
Monday = Jan 4 of Y + (W - 1) × 7 days - weekday(Jan 4 of Y) + 1
이유는 간단합니다. 1월 4일은 정의상 항상 ISO 1주에 속합니다(그 해 첫 4일 안에 있어, 반드시 목요일을 포함하는 주에 들어갑니다). 1월 4일이 속한 주의 월요일을 찾고, (W - 1)주만큼 앞으로 이동하면 됩니다.
더 깔끔한 동치 형태:
Monday of W1 = Jan 4 of Y - weekday(Jan 4 of Y) + 1
Monday of W = Monday of W1 + (W - 1) × 7
여기서 weekday는 월요일=1, 일요일=7(ISO 요일 번호)로 반환한다고 가정합니다.
예시: 2026년 23주
- 2026년 1월 4일은 일요일입니다. ISO weekday = 7.
- 1주의 월요일: 1월 4일 − 7 + 1 = 2025년 12월 29일.
- 23주의 월요일: 2025-12-29 + 22 × 7 = 154일 후 = 2026년 6월 1일.
- 23주의 일요일: 6월 1일 + 6 = 2026년 6월 7일.
2026년 23주는 2026년 6월 1일(월)부터 6월 7일(일)까지입니다.
연말·연초 경계 함정(Year Boundary Trap)
가장 흔한 실수는 “연도 Y의 1주는 항상 연도 Y 안에서 시작한다”고 가정하는 것입니다.
그렇지 않습니다.
1주는 첫 목요일을 포함하는 주입니다. 그 목요일이 1월 초에 있다면, 1주의 월요일은 전년도 12월에 있을 수 있습니다.
예시:
| ISO 주 | 연도 | 월요일 | 일요일 |
|---|---|---|---|
| W1 | 2025 | 2024년 12월 30일 | 2025년 1월 5일 |
| W1 | 2026 | 2025년 12월 29일 | 2026년 1월 4일 |
| W1 | 2027 | 2027년 1월 4일 | 2027년 1월 10일 |
| W1 | 2028 | 2028년 1월 3일 | 2028년 1월 9일 |
2025년 1주는 2024년 12월에 시작하고, 2026년 1주는 2025년 12월에 시작합니다.
즉:
- 2025년 12월 29–31일은 2025년이 아니라, ISO 2026년 1주에 속합니다.
- 누군가 “2026년 1주까지 배송”이라고 하면, 마감 주는 2025년 12월 29일에 시작하는 주입니다.
반대 방향 함정도 있습니다. 어떤 해의 마지막 며칠은 그 해의 마지막 주가 아니라 다음 해의 1주에 속합니다. 주를 라벨링할 때는 달력 연도 대신 ISO 주-연도(Python의 %G, PostgreSQL의 isoyear)를 써야 합니다.
어떤 주차든 전체 날짜 범위 구하기
월요일만 알면 나머지는 간단합니다:
| 요일 | 월요일 기준 오프셋 |
|---|---|
| Monday | +0 |
| Tuesday | +1 |
| Wednesday | +2 |
| Thursday | +3 |
| Friday | +4 |
| Saturday | +5 |
| Sunday | +6 |
주 W의 날짜 범위는 [월요일, 월요일 + 6일] 입니다.
업무일(월–금)만 필요하면 [월요일, 월요일 + 4일] 입니다.
Python
from datetime import date, timedelta
def iso_week_to_monday(year: int, week: int) -> date:
# Jan 4 is always in ISO week 1
jan4 = date(year, 1, 4)
# Move back to Monday of that week
week1_monday = jan4 - timedelta(days=jan4.weekday())
# Step forward to the target week
return week1_monday + timedelta(weeks=week - 1)
def iso_week_to_range(year: int, week: int) -> tuple[date, date]:
monday = iso_week_to_monday(year, week)
sunday = monday + timedelta(days=6)
return monday, sunday
# Examples
monday, sunday = iso_week_to_range(2026, 23)
print(monday) # 2026-06-01
print(sunday) # 2026-06-07
monday, sunday = iso_week_to_range(2026, 1)
print(monday) # 2025-12-29 ← note: starts in 2025
print(sunday) # 2026-01-04
Python에는 반대 방향(날짜→ISO 주)도 내장되어 있습니다:
d = date(2026, 6, 4)
iso_year, iso_week, iso_weekday = d.isocalendar()
print(iso_year, iso_week) # 2026 23
ISO 연도가 필요할 때는 d.year가 아니라 d.isocalendar().year를 사용하세요(연말·연초에서는 다를 수 있습니다).
Python 3.8+에서는 fromisocalendar로 반대로도 쉽게 구할 수 있습니다:
# Get Monday of ISO week 23, 2026 directly
monday = date.fromisocalendar(2026, 23, 1) # weekday 1 = Monday
print(monday) # 2026-06-01
Python 3.8 이상이라면 date.fromisocalendar(year, week, weekday)가 가장 깔끔합니다.
JavaScript
JavaScript는 ISO 주를 네이티브로 지원하지 않습니다. 수동 구현:
function isoWeekToMonday(year, week) {
// Jan 4 is always in ISO week 1
const jan4 = new Date(year, 0, 4)
const dayOfWeek = jan4.getDay() || 7 // convert Sun=0 to 7
const week1Monday = new Date(jan4)
week1Monday.setDate(jan4.getDate() - dayOfWeek + 1)
const monday = new Date(week1Monday)
monday.setDate(week1Monday.getDate() + (week - 1) * 7)
return monday
}
function isoWeekToRange(year, week) {
const monday = isoWeekToMonday(year, week)
const sunday = new Date(monday)
sunday.setDate(monday.getDate() + 6)
return { monday, sunday }
}
// Examples
const { monday, sunday } = isoWeekToRange(2026, 23)
console.log(monday.toISOString().slice(0, 10)) // 2026-06-01
console.log(sunday.toISOString().slice(0, 10)) // 2026-06-07
const w1 = isoWeekToRange(2026, 1)
console.log(w1.monday.toISOString().slice(0, 10)) // 2025-12-29
date-fns를 사용하면:
import { setISOWeek, setISOWeekYear, startOfISOWeek, endOfISOWeek } from 'date-fns'
function isoWeekToRange(year, week) {
let d = new Date(year, 0, 4) // any date in the target year
d = setISOWeekYear(d, year)
d = setISOWeek(d, week)
return {
monday: startOfISOWeek(d),
sunday: endOfISOWeek(d)
}
}
date-fns는 모든 경계 케이스를 올바르게 처리하므로, 프로덕션 코드에서는 권장되는 접근입니다.
Excel 및 Google Sheets
Excel에는 “주차→날짜” 함수가 직접적으로 없지만, 수식으로 구성할 수 있습니다.
연도 Y의 ISO 주 W의 월요일:
=DATE(Y,1,4) - WEEKDAY(DATE(Y,1,4),2) + 1 + (W-1)*7
분해하면:
DATE(Y,1,4)— 해당 연도의 1월 4일WEEKDAY(DATE(Y,1,4),2)— 월=1, 일=7로 요일 반환- 빼면 1주의 월요일
(W-1)*7을 더하면 목표 주로 이동
전체 범위를 원하면, 일요일은:
=Monday_formula + 6
시트 예시(A1=연도, B1=주):
Monday: =DATE(A1,1,4) - WEEKDAY(DATE(A1,1,4),2) + 1 + (B1-1)*7
Sunday: =Monday_cell + 6
두 셀을 날짜로 포맷하세요. 2026년 1주를 넣으면 월요일이 2025년 12월 29일로 나오는데, 이게 맞습니다.
반대 방향(날짜→ISO 주): ISOWEEKNUM(date)를 사용하세요. ISO 연도는 Excel에 네이티브 함수가 없어서 ISOWEEKNUM 관련 글의 우회 방법을 사용해야 합니다.
SQL
PostgreSQL은 ISO 지원이 가장 완전합니다:
-- Monday of ISO week W in year Y
SELECT
make_date(2026, 1, 4)
+ (23 - 1) * 7 -- step to week 23
- EXTRACT(isodow FROM make_date(2026, 1, 4))::int + 1
AS week_monday;
-- 2026-06-01
-- Or more cleanly using generate_series for a range lookup
SELECT
d::date AS week_monday,
(d + 6)::date AS week_sunday,
EXTRACT(isoyear FROM d) AS iso_year,
EXTRACT(week FROM d) AS iso_week
FROM generate_series(
DATE '2026-01-01',
DATE '2026-12-31',
INTERVAL '7 days'
) d
WHERE EXTRACT(week FROM d) = 23
AND EXTRACT(isoyear FROM d) = 2026;
ISO 포맷 코드를 이용해 to_date로 더 깔끔하게:
-- Convert ISO year + week to Monday
SELECT to_date('2026' || '23' || '1', 'IYYYIWid') AS monday;
-- 2026-06-01
-- Format: IYYY=ISO year, IW=ISO week, id=ISO day (1=Monday)
이 방식이 가장 단순합니다. YYYYWWD 형태 문자열을 만들고 ISO 포맷 코드로 파싱합니다.
MySQL:
-- Monday of ISO week 23, 2026
SELECT STR_TO_DATE('202623 Monday', '%X%V %W');
-- 2026-06-01
-- Or step-based:
SELECT DATE_ADD(
DATE_ADD(STR_TO_DATE('2026-01-04', '%Y-%m-%d'),
INTERVAL (-(WEEKDAY(STR_TO_DATE('2026-01-04', '%Y-%m-%d')))) DAY),
INTERVAL (23 - 1) * 7 DAY
) AS week_monday;
SQL Server:
-- Monday of ISO week 23, 2026
DECLARE @year INT = 2026, @week INT = 23
SELECT DATEADD(
DAY,
(@week - 1) * 7
- (DATEPART(WEEKDAY, DATEFROMPARTS(@year, 1, 4)) + 5) % 7,
DATEFROMPARTS(@year, 1, 4)
) AS week_monday;
-- 2026-06-01
미국식 주차를 날짜로 변환(US-Style)
만약 주차가 미국식 시스템(1주=1월 1일 포함, 주 시작=일 또는 월)에서 왔다면, 연말·연초 경계 문제가 없어서 더 간단합니다:
주 시작(일요일 기준):
Week_start = DATE(Y, 1, 1) + (W - 1) × 7 - WEEKDAY(DATE(Y, 1, 1), 1)
여기서 WEEKDAY는 일=1, 토=7로 반환합니다.
하지만 일정·물류에서는 미국식보다 ISO가 훨씬 흔합니다. 시스템을 명시하지 않고 주차만 전달받았다면, 특히 국제/유럽 비즈니스 컨텍스트에서는 ISO라고 가정하는 편이 안전합니다.
2026 빠른 참고: ISO 1–10주, 48–53주
| ISO 주 | 연도 | 월요일 | 일요일 |
|---|---|---|---|
| W1 | 2026 | 2025-12-29 | 2026-01-04 |
| W2 | 2026 | 2026-01-05 | 2026-01-11 |
| W3 | 2026 | 2026-01-12 | 2026-01-18 |
| W4 | 2026 | 2026-01-19 | 2026-01-25 |
| W5 | 2026 | 2026-01-26 | 2026-02-01 |
| W6 | 2026 | 2026-02-02 | 2026-02-08 |
| W7 | 2026 | 2026-02-09 | 2026-02-15 |
| W8 | 2026 | 2026-02-16 | 2026-02-22 |
| W9 | 2026 | 2026-02-23 | 2026-03-01 |
| W10 | 2026 | 2026-03-02 | 2026-03-08 |
| ... | |||
| W48 | 2026 | 2026-11-23 | 2026-11-29 |
| W49 | 2026 | 2026-11-30 | 2026-12-06 |
| W50 | 2026 | 2026-12-07 | 2026-12-13 |
| W51 | 2026 | 2026-12-14 | 2026-12-20 |
| W52 | 2026 | 2026-12-21 | 2026-12-27 |
| W53 | 2026 | 2026-12-28 | 2027-01-03 |
2026년 1주는 2025-12-29에 시작합니다. 그리고 2026년 53주는 2027-01-03에 끝납니다 — 즉, 2026년은 53주가 있는 해입니다.
흔한 실수 요약
연도를 포함하지 않기. “8주”는 모호합니다. 항상 2026-W08처럼 표현하세요.
달력 연도로 ISO 주를 라벨링하기. 2025-12-29는 2025년이 아니라 ISO 2026년 1주입니다. 이를 2025로 저장하면 잘못된 버킷에 들어갑니다.
1주가 1월 1일에 시작한다고 가정하기. ISO에서는 그렇지 않습니다. 많은 해에서 1주는 12월 29/30/31에 시작합니다. 1월 1일이 항상 1주에 있어야 한다면 ISO가 아니라 미국식 시스템입니다.
월요일 공식의 off-by-one. 기준(anchor)은 1월 4일입니다 — 1월 1일이 아닙니다(1월 1일은 전년도 마지막 주에 속할 수 있음). 1월 1일을 기준으로 쓰면, 1월 1일이 주 후반에 떨어지는 해에서 결과가 틀립니다.
연말·연초 날짜를 테스트하지 않기. 날짜 처리 코드는 12월 28–31일, 1월 1–4일로 반드시 테스트하세요. 모든 경계 케이스는 이 며칠에 몰려 있습니다.
ISO 주차 계산기로 어떤 주차든 날짜 범위를 확인하거나, 현재 주차 페이지에서 오늘의 ISO 주차와 주간 범위를 확인하세요.