Я использовал классы оболочки C ++ / CLI , описанные здесь , и это было относительно легко реализовать.
Я не заметил это ранее, когда я смотрел документация для календарного модуля , но метод, названный , monthrange предоставляет эту информацию:
monthrange (год, месяц)
рабочий день Возвратов первого дня месяца и количества дней в месяце, в течение указанного года и месяца.
>>> 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)
Мой предыдущий ответ все еще работы, но является явно субоптимальным.
РЕДАКТИРОВАНИЕ: см. мой другой ответ . Это имеет лучшую реализацию, чем этот, которого я оставляю здесь на всякий случай, кто-то заинтересовал наблюдением, как каждый мог бы калькулятор "самокрутки".
@John Миллисемья дает хороший ответ с добавленной сложностью вычисления первого дня следующего месяца.
следующее не особенно изящно, но выяснять в последний день месяца, что любая поданная дата живет, Вы могли попробовать:
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)
РЕДАКТИРОВАНИЕ: См. ответ @Blair Conrad для более чистого решения
<час>>>> import datetime
>>> datetime.date (2000, 2, 1) - datetime.timedelta (days = 1)
datetime.date(2000, 1, 31)
>>>
Другое решение состояло бы в том, чтобы сделать что-то вроде этого:
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)