904 Stimmen

Wie kann man den letzten Tag des Monats ermitteln?

Gibt es eine Möglichkeit, mit Python's Standardbibliothek leicht zu bestimmen (d.h. ein Funktionsaufruf) den letzten Tag eines bestimmten Monats?

Wenn die Standardbibliothek dies nicht unterstützt, unterstützt das dateutil-Paket dies?

42voto

Satish Reddy Punkte 583

Verwendung von dateutil.relativedelta erhalten Sie das letzte Datum des Monats wie folgt:

from dateutil.relativedelta import relativedelta
last_date_of_month = datetime(mydate.year, mydate.month, 1) + relativedelta(months=1, days=-1)

Die Idee ist, den ersten Tag des Monats zu ermitteln und die relativedelta um 1 Monat voraus und 1 Tag zurück zu gehen, so dass Sie den letzten Tag des gewünschten Monats erhalten würden.

22voto

jfs Punkte 370717

In Python 3.7 gibt es die undokumentierten calendar.monthlen(year, month) 機能 :

>>> calendar.monthlen(2002, 1)
31
>>> calendar.monthlen(2008, 2)
29
>>> calendar.monthlen(2100, 2)
28

Dies entspricht die dokumentierten calendar.monthrange(year, month)[1] aufrufen .

2 Stimmen

Dies scheint unter Python 3.8.1 nicht zu funktionieren: AttributeError: Modul 'Kalender' hat kein Attribut 'monthlen'

2 Stimmen

@jeppoo1: ja, es ist als privat gekennzeichnet in bpo-28292 -- erwartet für eine undokumentierte Funktion.

2 Stimmen

Ab Python 3.8 heißt es calendar._monthlen .

22voto

DoOrDoNot Punkte 1022
>>> import datetime
>>> import calendar
>>> date  = datetime.datetime.now()

>>> print date
2015-03-06 01:25:14.939574

>>> print date.replace(day = 1)
2015-03-01 01:25:14.939574

>>> print date.replace(day = calendar.monthrange(date.year, date.month)[1])
2015-03-31 01:25:14.939574

3 Stimmen

Großartige Antwort! Um das Start- und Enddatum zu ermitteln start_date = datetime.today().replace(day=1).date() ; last_date = date.replace(day = calendar.monthrange(date.year, date.month)[1]).date()

21voto

Collin Anderson Punkte 13449
from datetime import timedelta
(any_day.replace(day=1) + timedelta(days=32)).replace(day=1) - timedelta(days=1)

3 Stimmen

Das ist der Stoff, aus dem die Wanzen sind ;) Versuchen Sie es mit 31 von Januar

0 Stimmen

@LeartS: Das funktioniert bei mir. Was passiert, wenn Sie es versuchen?

3 Stimmen

Es funktioniert. any_day ist der 31. Januar, wir ersetzen day durch 1, also der 1. Januar, addieren 32 Tage und erhalten den 2. Februar, ersetzen wieder durch day=1 und erhalten den 1. Februar. Ziehen Sie einen Tag ab und erhalten den 31. Januar. Ich verstehe nicht, wo das Problem liegt. Welchen Tag erhältst du?

20voto

Eine andere Lösung wäre, wie folgt vorzugehen:

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

Und verwenden Sie die Funktion wie folgt:

>>> 
>>> 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)

10 Stimmen

Zu komplex, bricht die dritte Regel des Zen von Python.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X