Python - 특정 월의 시작 날짜, 마지막 날짜 얻기

파이썬에서 특정 월의 첫째 날짜와 마지막 날짜를 계산하는 방법을 소개합니다. 현재 시간이 속한 달에서 첫째날과 마지막 날짜를 얻어서 어떤 작업을 처리하고 싶을 때 계산이 필요합니다.

이 글에서는 calendar를 이용한 방법과, datetime를 이용하여 직접 계산하는 방법을 모두 소개합니다.

1. calendar를 사용하여 시작 날짜, 마지막날 얻기

calendar를 사용하여 시작 날짜와, 마지막 날짜를 계산할 수 있습니다. calendar.monthrange(year, month)는 인자로 전달된 월의 범위를 Tuple로 리턴합니다. 리턴 값의 monthrange[0]은 시작 날짜가 되고, monthrange[1]는 마지막 날짜가 됩니다. 마지막 날짜의 date 객체가 필요하다면 replace(day=last_day)로 date 객체의 날짜를 변경할 수 있습니다.

import calendar
from datetime import datetime


def getMonthRage(year, month):
    date = datetime(year=year, month=month, day=1).date()
    monthrange = calendar.monthrange(date.year, date.month)
    first_day = calendar.monthrange(date.year, date.month)[0]
    last_day = calendar.monthrange(date.year, date.month)[1]
    print(f"date: {date}")
    print(f"month range: {monthrange}")
    print(f"first day: {first_day}")
    print(f"last day: {last_day}")
    return monthrange


today = datetime.today().date()
month_range = getMonthRage(today.year, today.month)

last_date = today.replace(day=month_range[1])
print(f"last date: {last_date}")

Output:

date: 2022-03-01
month range: (1, 31)
first day: 1
last day: 31
last date: 2022-03-31

2. datetime, timedelta로 시작 날짜, 마지막 날짜 얻기

datetime, timedelta를 이용하여 해당 월의 시작 날짜와 마지막 날짜를 계산할 수 있습니다. 여기서 계산 방법의 핵심은 다음 달의 시작 날짜에서 하루를 빼면 이번 달의 마지막 날짜라는 사실을 이용합니다.

아래 코드를 보시면 this_month는 인자로 입력받은 년도와 월로 만들며, 시작 날짜는 항상 1이기 때문에 day는 1로 설정합니다. 마지막 날짜는 다음달 1일에서 하루를 빼면 되는데, 먼저 다음달 1일에 대한 date 객체를 만듭니다. this_monthrelativedelta(months=1)를 더하면 다음달 1일의 date 객체가 됩니다. 이제 next_month에서 timedelta(days=1)로 하루를 빼면 이번 달의 마지막 날짜가 됩니다.

from datetime import datetime
from datetime import timedelta
from dateutil import relativedelta


def getMonthRage(year, month):
    this_month = datetime(year=year, month=month, day=1).date()
    next_month = this_month + relativedelta.relativedelta(months=1)
    print(f"this month: {this_month}")
    print(f"next month: {next_month}")

    first_day = this_month
    last_day = next_month - timedelta(days=1)
    print(f"first day: {first_day}")
    print(f"last day: {last_day}")
    return (first_day.day, last_day.day)


month_range = getMonthRage(2021, 12)
print(month_range)

Output:

this month: 2021-12-01
next month: 2022-01-01
first day: 2021-12-01
last day: 2021-12-31
(1, 31)
Loading script...
codechachaCopyright ©2019 codechacha