주어진 달의 마지막 날을 쉽게 결정하기 위해 파이썬의 표준 라이브러리를 사용하는 방법이 있습니까?
표준 라이브러리가이를 지원하지 않으면 dateutil 패키지가이를 지원합니까?
답변
나는 모듈 에 대한 문서를calendar
볼 때 이것을 일찍 알지 못했지만 라는 메소드가 monthrange
다음 정보를 제공합니다.
monthrange (year, month)
지정된 연도 및 월에 대해 월의 첫 번째 요일과 월의 일 수를 반환합니다.
>>> import calendar
>>> calendar.monthrange(2002,1)
(1, 31)
>>> calendar.monthrange(2008,2)
(4, 29)
>>> calendar.monthrange(2100,2)
(0, 28)
그래서:
calendar.monthrange(year, month)[1]
가장 간단한 방법 인 것 같습니다.
명확하게하기 위해 monthrange
윤년도 지원합니다.
>>> from calendar import monthrange
>>> monthrange(2012, 2)
(2, 29)
내 이전 답변은 여전히 작동하지만 분명히 차선책입니다.
답변
calendar
모듈 을 가져 오지 않으려는 경우 간단한 2 단계 기능도 있습니다.
import datetime
def last_day_of_month(any_day):
next_month = any_day.replace(day=28) + datetime.timedelta(days=4) # this will never fail
return next_month - datetime.timedelta(days=next_month.day)
출력 :
>>> for month in range(1, 13):
... print last_day_of_month(datetime.date(2012, month, 1))
...
2012-01-31
2012-02-29
2012-03-31
2012-04-30
2012-05-31
2012-06-30
2012-07-31
2012-08-31
2012-09-30
2012-10-31
2012-11-30
2012-12-31
답변
편집 : 깨끗한 솔루션에 대해서는 @Blair Conrad의 답변을 참조하십시오
>>> import datetime
>>> datetime.date(2000, 2, 1) - datetime.timedelta(days=1)
datetime.date(2000, 1, 31)
답변
이것은 실제로 꽤 쉽습니다 dateutil.relativedelta
(pip 용 python-datetutil 패키지). day=31
항상 해당 월의 마지막 날을 반환합니다.
예:
from datetime import datetime
from dateutil.relativedelta import relativedelta
date_in_feb = datetime.datetime(2013, 2, 21)
print datetime.datetime(2013, 2, 21) + relativedelta(day=31) # End-of-month
>>> datetime.datetime(2013, 2, 28, 0, 0)
답변
편집 : 내 다른 대답을 참조하십시오 . 이것은이 것보다 더 나은 구현을 가지고 있는데, 누군가가 자신의 계산기를 어떻게 굴릴 수 있는지 알고 싶은 경우를 대비하여 여기에 남겨둔다.
@John Millikin은 다음 달 첫 날 계산의 복잡성을 추가하여 좋은 답변을 제공합니다.
다음은 특히 우아하지는 않지만 주어진 날짜가 사는 달의 마지막 날을 파악하기 위해 시도해 볼 수 있습니다.
def last_day_of_month(date):
if date.month == 12:
return date.replace(day=31)
return date.replace(month=date.month+1, day=1) - datetime.timedelta(days=1)
>>> last_day_of_month(datetime.date(2002, 1, 17))
datetime.date(2002, 1, 31)
>>> last_day_of_month(datetime.date(2002, 12, 9))
datetime.date(2002, 12, 31)
>>> last_day_of_month(datetime.date(2008, 2, 14))
datetime.date(2008, 2, 29)
답변
dateutil.relativedelta
당신을 사용하면 다음과 같이 마지막 달의 날짜를 얻을 수 있습니다 :
from dateutil.relativedelta import relativedelta
last_date_of_month = datetime(mydate.year, mydate.month, 1) + relativedelta(months=1, days=-1)
아이디어는 달의 첫날을 가져 와서 한 relativedelta
달 앞뒤로 돌아가서 원하는 달의 마지막 날을 얻는 것입니다.
답변
또 다른 해결책은 다음과 같이하는 것입니다.
from datetime import datetime
def last_day_of_month(year, month):
""" Work out the last day of the month """
last_days = [31, 30, 29, 28, 27]
for i in last_days:
try:
end = datetime(year, month, i)
except ValueError:
continue
else:
return end.date()
return None
그리고이 기능을 사용하십시오 :
>>>
>>> last_day_of_month(2008, 2)
datetime.date(2008, 2, 29)
>>> last_day_of_month(2009, 2)
datetime.date(2009, 2, 28)
>>> last_day_of_month(2008, 11)
datetime.date(2008, 11, 30)
>>> last_day_of_month(2008, 12)
datetime.date(2008, 12, 31)