파이썬에서 한 달의 마지막 날을 구하려면 표준 라이브러리인 calendar 모듈을 사용하는 것이 가장 간단하고 확실한 방법입니다. 이 모듈은 특정 연도와 월에 대한 달력 정보를 손쉽게 조회할 수 있는 다양한 기능을 제공합니다.
monthrange() 함수란?
calendar.monthrange(year, month) 함수는 지정한 연도와 월에 대해 두 가지 정보를 튜플(tuple) 형태로 반환합니다.
- 첫 번째 값: 그 달 1일의 요일 (월요일=0, 화요일=1, ... , 일요일=6)
- 두 번째 값: 그 달의 총 일수 (28~31)
이 두 정보를 조합하면 해당 월의 마지막 날짜 또는 마지막 날의 요일을 쉽게 계산할 수 있습니다.
예제 1: 마지막 날의 요일 구하기
import calendar # 2017년 12월 기준 first_day_weekday, num_days = calendar.monthrange(2017, 12) last_week = num_days % 7 last_day = (first_day_weekday + last_week) % 7 print(last_day)
출력 결과
0
결과값 0은 월요일을 의미합니다. 즉, 2017년 12월의 마지막 날인 12월 31일은 월요일이었습니다. 참고로 파이썬의 calendar 모듈에서는 요일이 0부터 6까지의 숫자로 표현되며, 월요일이 0, 일요일이 6입니다.
예제 2: 마지막 날짜 자체를 구하기
실무에서는 요일보다 실제 날짜가 필요한 경우가 더 많습니다. monthrange()가 반환하는 두 번째 값이 곧 그 달의 총 일수, 즉 마지막 날짜이므로 아래와 같이 간단히 구할 수 있습니다.
import calendar import datetime year, month = 2017, 12 # 그 달의 총 일수 = 마지막 날짜 last_day_num = calendar.monthrange(year, month)[1] print(last_day_num) # 31 # datetime 객체로 변환 last_date = datetime.date(year, month, last_day_num) print(last_date) # 2017-12-31
대체 방법: datetime 모듈만으로 계산하기
calendar 모듈 없이 datetime 모듈만으로도 '다음 달 1일에서 하루를 빼는' 방식으로 마지막 날을 구할 수 있습니다.
from datetime import date, timedelta
def get_last_day_of_month(year, month):
# 다음 달 1일에서 하루를 빼면 이번 달의 마지막 날
if month == 12:
next_month_first = date(year + 1, 1, 1)
else:
next_month_first = date(year, month + 1, 1)
return next_month_first - timedelta(days=1)
print(get_last_day_of_month(2017, 12)) # 2017-12-31
정리
calendar.monthrange(year, month)는 (첫날 요일, 총 일수) 튜플을 반환하며, 가장 널리 쓰이는 방법입니다.- 반환된 총 일수가 곧 마지막 날짜이므로 인덱싱
[1]로 바로 활용할 수 있습니다. - 윤년(2월 29일) 처리도 자동으로 이루어지기 때문에 별도의 예외 처리가 필요하지 않습니다.