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

Есть ли способ использовать стандартную библиотеку Python для простого определения (то есть одного вызова функции) последнего дня данного месяца?

Если стандартная библиотека не поддерживает это, поддерживает ли пакет dateutil это? ?

553
задан 01.10.2019, 08:44

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)

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

963
ответ дан 01.10.2019, 08:58

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

<час>
>>> import datetime
>>> datetime.date (2000, 2, 1) - datetime.timedelta (days = 1)
datetime.date(2000, 1, 31)
>>> 
66
ответ дан 01.10.2019, 08:45
  • 1
    Это полезно для знания – nterry 04.02.2014, 23:49
  • 2
    Я на самом деле назвал бы этот инструмент для очистки, за исключением того, что это перестало работать в декабре, когда today.month + 1 == 13 и Вы добираетесь ValueError. – fletom 01.10.2019, 08:46

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

@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)
43
ответ дан 01.10.2019, 08:45
  • 1
    См. J-_-L' s отвечают ниже за [2]. – Michael Kohl 14.06.2011, 16:33

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

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
ответ дан 01.10.2019, 08:47
  • 1
    прекрасный! цените - изученный еще больше тогда ожидаемый:) – BreakPhreak 14.06.2011, 17:18
  • 2
    Слишком сложный, нарушает третье правило дзэн Python. – markuz 01.10.2019, 08:47
  • 3
    Субоптимальное решение, но это работает. – Gringo Suave 01.10.2019, 08:48

Теги

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