Получить последний день месяца в Python

Я использовал классы оболочки C ++ / CLI , описанные здесь , и это было относительно легко реализовать.

528
задан Cristian 4 September 2008 в 00:54
поделиться

4 ответа

Я не заметил это ранее, когда я смотрел документация для календарного модуля , но метод, названный , 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)

Мой предыдущий ответ все еще работы, но является явно субоптимальным.

935
ответ дан Community 4 September 2008 в 00:54
поделиться

РЕДАКТИРОВАНИЕ: см. мой другой ответ . Это имеет лучшую реализацию, чем этот, которого я оставляю здесь на всякий случай, кто-то заинтересовал наблюдением, как каждый мог бы калькулятор "самокрутки".

@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)
41
ответ дан Blair Conrad 4 September 2008 в 00:54
поделиться

РЕДАКТИРОВАНИЕ: См. ответ @Blair Conrad для более чистого решения

<час>
>>> import datetime
>>> datetime.date (2000, 2, 1) - datetime.timedelta (days = 1)
datetime.date(2000, 1, 31)
>>> 
65
ответ дан John Millikin 4 September 2008 в 00:54
поделиться

Другое решение состояло бы в том, чтобы сделать что-то вроде этого:

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)
13
ответ дан Ulf Gjerdingen 4 September 2008 в 00:54
поделиться
  • 1
    прекрасный! цените - изученный еще больше тогда ожидаемый:) – BreakPhreak 14 June 2011 в 14:18
Другие вопросы по тегам:

Похожие вопросы: