두 날짜 사이의 근무주 계산하기 (그리고 생각보다 복잡한 이유)
두 날짜 사이의 근무주 개수를 알아야 한다면, 간단할 것 같습니다. 일수를 7로 나누고, 주말을 빼면 끝.
그런데 그렇게 간단하지 않습니다. "근무주"는 정확하게 정의된 용어가 아니기 때문입니다. 퇴사 예고 기간, 프로젝트 일정, 휴가 권리, 계약 기간 등 무엇을 계산하느냐에 따라 올바른 방법이 달라집니다. 잘못된 방법을 사용하면 법적, 재정적으로 중요한 며칠 차이가 발생할 수 있습니다.
"근무주"란 정확히 무엇인가?
근무주는 보통 5일을 의미합니다. 월요일부터 금요일까지 말입니다. 하지만 알아두면 좋은 예외 사항들이 있습니다:
- 일부 업계와 국가에서는 6일 근무주(월요일–토요일)를 사용합니다
- 일부 직책은 4일 단축 근무주를 실시합니다
- 중동에서는 전통적으로 일요일–목요일 근무를 했지만, 대부분의 국가가 월요일–금요일로 변경했습니다
- 시간제 근로자는 2일, 3일, 4일의 근무주를 가질 수 있습니다
이 글에서 "근무주"는 달리 명시되지 않은 이상 표준 월요일–금요일 주를 의미합니다. 상황에 맞는 근무일을 파악하면 이 방법들을 일반화할 수 있습니다.
방법 1: 완전한 근무주
가장 단순한 해석: 두 날짜 사이에 월요일부터 금요일까지의 완전한 블록이 몇 개 들어맞는가?
이것이 "예고 기간이 몇 주냐?"는 질문에 대한 대부분의 의미입니다. 4주 예고 기간은 4개의 완전한 월요일–금요일 블록을 의미하며, 이는 20 근무일이고, 시작 날짜가 주의 어느 날에 있는지와 무관합니다.
계산 방법:
1. 두 날짜 사이의 전체 달력 일수를 센다 2. 주말을 뺀다: 7일 블록마다 2일의 주말이 있다 3. 처음과 마지막의 부분 주를 계산한다
실제로는 근무일을 직접 세고 5로 나누는 것이 더 쉽습니다:
근무주 = 근무일 / 5
여기서 근무일은 두 날짜 사이의 월요일부터 금요일까지의 일수입니다.
예시: 4월 7일(월요일)부터 5월 2일(금요일)까지
- 달력 일수: 25일
- 범위 내 주말: 4개 토요일 + 4개 일요일 = 8일
- 근무일: 25 − 8 = 17... 이건 맞지 않습니다.
올바른 방법: 월요일부터 금요일까지 포함하여 센다:
- 주 1: 4월 7–11(5일)
- 주 2: 4월 14–18(5일)
- 주 3: 4월 21–25(5일)
- 주 4: 4월 28–5월 2(5일)
합계: 20 근무일 = 정확히 4 근무주
이 예시는 월요일에 시작하고 금요일에 끝나기 때문에 깔끔하게 떨어집니다. 주중에 시작하거나 끝나면 분수 결과가 나오는데, 이것이 다음 방법으로 이어집니다.
방법 2: 근무일을 5로 나누기
대부분의 실무 목적에서 — 프로젝트 계획, 일정 추정, 용량 계산 — 완전한 주가 필요하지 않습니다. 근무일이 필요하며, 결과를 주와 일로 표현합니다.
공식:
전체_근무일 = (완전한_주 × 5) + 부분_주의_근무일
주 = floor(전체_근무일 / 5)
남은_일 = 전체_근무일 mod 5
예시: 3월 18일(수요일)부터 4월 11일(금요일)까지
근무일을 센다:
- 3월 18일(수) – 3월 21일(금): 4일
- 3월 24–28: 5일
- 3월 31–4월 4: 5일
- 4월 7–11: 5일
합계: 19 근무일 = 3주 4일
이 방법은 일 기준의 용량으로 작업하는 프로젝트 일정에 적합합니다.
방법 3: ISO 주 범위
때로 "사이의 주가 몇 개인가"는 ISO 주 번호의 차이를 의미합니다.
예시: 어떤 행사가 ISO 주 10부터 주 23까지 진행된다면, 이는 13 ISO 주간의 기간입니다.
계산:
주_범위 = (종료_iso_연도 × 52.18) + 종료_iso_주 − (시작_iso_연도 × 52.18) + 시작_iso_주
실제로는 같은 연도 내의 날짜의 경우:
주_범위 = 종료_iso_주 − 시작_iso_주
연도 경계를 넘어가는 날짜의 경우, 시작 연도가 52주인지 53주인지 고려해야 합니다:
주_범위 = (시작_연도의_52_또는_53 − 시작_iso_주) + 종료_iso_주
이 방법은 방송 일정, 소매 계획, 그리고 근무일보다는 ISO 주 번호로 업무를 정리하는 모든 시스템에 관련이 있습니다.
날짜 포함 범위 문제
가장 흔한 오류 원인 중 하나: 시작 날짜, 종료 날짜, 둘 다, 아니면 둘 다 세지 않을 것인가.
"오늘부터 4주 예고"는 다음을 의미할 수 있습니다:
- 오늘부터 4주로, 오늘이 1일차(시작 포함): 4주 뒤 같은 요일에 종료
- 오늘 이후 4주(시작 제외): 위의 기간보다 하루 늦게 종료
대부분의 국가의 노동법은 이를 명시합니다. 영국 노동법은 예고를 받은 다음날부터 예고 기간을 센다. 미국은 계약에 따라 다릅니다.
차이는 1일입니다. 대부분의 경우 중요하지 않습니다. 노동 분쟁이나 계약 종료 시에는 중요할 수 있습니다.
안전한 관례: 항상 "X 근무주 시작일 [날짜], 포함/제외"로 명시하세요. 모호하게 남겨두지 마세요.
공휴일: 모두가 잊는 계산
공휴일을 고려하지 않은 근무주 계산은 정의상 잘못됩니다. 사용 가능한 근무 시간을 과다 계산하게 됩니다.
어려운 점: 공휴일은 표준화되지 않았습니다. 다음에 따라 다릅니다:
- 국가(크리스마스는 영국에서 12월 25일이지만, 일본에서는 공휴일이 아닙니다)
- 국가 내 지역(미국 주마다 공휴일이 다르며, 영국과 스코틀랜드의 은행 휴일이 다릅니다)
- 연도(부활절 같은 변동 공휴일은 매년 날짜가 바뀝니다)
- 고용 계약(일부 직책은 추가 휴일이 있으며, 일부 공무원은 다른 날짜를 따릅니다)
대략적인 추정에 대해서는 — "약 6 근무주"— 공휴일을 무시해도 괜찮습니다. 정확한 계산 — 계약 기한, 예고 기간, 법적 기간 — 에서는 해당하는 공휴일을 빼야 합니다.
어떤 계산기도 관할권과 연도를 알지 못하면 자동으로 이를 수행할 수 없습니다. 날짜 사이 계산기는 주말을 제외한 근무일 수를 제공합니다. 현지 공휴일은 직접 빼세요.
영국의 유용한 근사치: 연간 약 8개의 은행 휴일이 있으며, 대략 월간 1.6개입니다. 3개월 계산의 경우 약 5개 공휴일을 빼세요. 미국 연방 공휴일의 경우: 연간 11개, 대략 월간 0.9개입니다.
예고 기간: 수학이 실제로 어떻게 작동하는가
고용 계약에서 예고 기간은 주 또는 개월 단위로 명시됩니다. 이를 근무일로 변환하는 것이 가장 많은 오류가 발생하는 부분입니다.
"4주 예고" 는 4개의 달력 주(28일)를 의미하며, 4 × 5 = 20 근무일이 아닙니다. 예고를 화요일에 하면, 28개의 달력 일 동안 진행됩니다. 4주 뒤 화요일이 예고 기간의 마지막 날입니다.
이는 사람들을 놀라게 합니다. 왜냐하면 "4주"가 20 근무일을 의미한다고 생각하기 때문입니다. 그렇지 않습니다. 28 달력 일을 의미하며, 그 안의 주말도 예고 기간에 포함되는데, 그 날들은 일하지 않아도 계산됩니다.
"1개월 예고" 는 더욱 불명확합니다. 1월 15일부터 1개월은 2월 15일입니다. 1월 31일부터 1개월은 2월 28일(또는 윤년에 29일)입니다. 달력 일수는 28~31일 변합니다. 그 달 안의 근무일 수는 20~23일 변합니다.
계약의 주 대 달력 주:
계약에 "4 근무주 예고"라고 명시되어 있으면, 이는 20 근무일을 의미합니다. 월요일부터 금요일만 해당됩니다. 주말은 계산되지 않습니다. 이 경우 화요일에 시작하는 예고는 20 근무일 동안 진행되어, 기간 내 주말 개수에 따라 여러 달력 주 뒤에 끝납니다.
계약에 "주"인지 "근무주"인지 명시되어 있는지 항상 확인하세요. 이 차이는 일반적인 예고 기간 동안 8–10일이 될 수 있습니다.
프로젝트 일정: 근무 노력 대 달력 주
프로젝트 관리에서 "3주 작업"과 "3 달력 주"는 같지 않습니다.
완전 용량의 3주 노력 = 15 사람-근무일. 한 사람이 전일제로 일할 때 3주 작업이면, 3 달력 주가 걸립니다. 두 사람이 공유하면 1.5 달력 주가 걸립니다. 한 사람이 50% 용량이면 6 달력 주가 걸립니다.
3 달력 주 = 공휴일이 없고, 누구도 시간제가 아니며, 문맥 전환 오버헤드가 없다고 가정할 때 15 근무일.
이 구분은 납기 일정을 계획할 때 중요합니다. 이해관계자에게 기능이 "3주"가 걸린다고 말했는데, 80% 용량에서의 근무주를 의미하고 그 사이에 은행 휴일이 있다면, 달력상 종료 날짜는 그들이 상상하는 것과 상당히 다릅니다.
일정을 인용할 때:
- 한 달 미만의 작업은 주가 아닌 근무일로 명시하세요
- 달력 종료 날짜를 합리성 확인으로 제시하세요
- 그 기간 내 공휴일을 명시적으로 주목하세요
코드에서 근무주 계산하기
Python:
from datetime import date, timedelta
def working_days(start: date, end: date) -> int:
total = 0
current = start
while current <= end:
if current.weekday() < 5: # 0=월, 4=금
total += 1
current += timedelta(days=1)
return total
def working_weeks(start: date, end: date) -> float:
return working_days(start, end) / 5
# 예시
start = date(2026, 4, 7)
end = date(2026, 5, 2)
print(working_days(start, end)) # 20
print(working_weeks(start, end)) # 4.0
큰 날짜 범위의 경우, 루프를 피하기 위해 모듈로 산술을 사용하는 더 빠른 방법이 있습니다:
def working_days_fast(start: date, end: date) -> int:
days = (end - start).days + 1
full_weeks, remainder = divmod(days, 7)
working = full_weeks * 5
# 부분 주의 근무일 계산
start_dow = start.weekday() # 0=월
for i in range(remainder):
if (start_dow + i) % 7 < 5:
working += 1
return working
JavaScript:
function workingDays(start, end) {
let count = 0
const current = new Date(start)
while (current <= end) {
const day = current.getDay()
if (day !== 0 && day !== 6) count++ // 0=일, 6=토
current.setDate(current.getDate() + 1)
}
return count
}
function workingWeeks(start, end) {
return workingDays(start, end) / 5
}
SQL (PostgreSQL):
-- 두 날짜 사이의 근무일(주말 제외)
SELECT
(EXTRACT(DOW FROM end_date) - EXTRACT(DOW FROM start_date))::int +
((end_date - start_date) / 7) * 5 +
CASE WHEN EXTRACT(DOW FROM start_date) = 0 THEN 1 ELSE 0 END +
CASE WHEN EXTRACT(DOW FROM end_date) = 6 THEN -1 ELSE 0 END
AS working_days
FROM (SELECT DATE '2026-04-07' AS start_date, DATE '2026-05-02' AS end_date) t;
빠른 참고
| 필요한 것 | 방법 |
|---|---|
| 예고 기간 기간 | 달력 일(주말 포함) |
| 프로젝트 근무 용량 | 근무일(월–금), 주를 위해 5로 나누기 |
| 방송/소매 계획 | ISO 주 범위 |
| 휴가 권리 | 근무일, 공휴일 빼기 |
| 계약 기한 | 달력 일(계약에 "근무일"이라 명시되지 않은 이상) |
날짜 사이 계산기는 모든 날짜 범위에 대해 달력 일과 근무일을 모두 보여줍니다. 관할권의 공휴일로 조정하기 전에 시작점으로 유용합니다.


