Holen Sie sich den letzten Tag des Monats

Lesezeit: 4 Minuten

Cristians Benutzeravatar
Cristian

Gibt es eine Möglichkeit, mit der Standardbibliothek von Python den letzten Tag eines bestimmten Monats einfach zu bestimmen (dh mit einem Funktionsaufruf)?

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

Augustomens Benutzeravatar
Augustusmann

Wenn Sie das nicht importieren möchten calendar Modul kann eine einfache zweistufige Funktion auch sein:

import datetime

def last_day_of_month(any_day):
    # The day 28 exists in every month. 4 days later, it's always next month
    next_month = any_day.replace(day=28) + datetime.timedelta(days=4)
    # subtracting the number of the current day brings us back one month
    return next_month - datetime.timedelta(days=next_month.day)

Ausgänge:

>>> for month in range(1, 13):
...     print(last_day_of_month(datetime.date(2022, month, 1)))
...
2022-01-31
2022-02-28
2022-03-31
2022-04-30
2022-05-31
2022-06-30
2022-07-31
2022-08-31
2022-09-30
2022-10-31
2022-11-30
2022-12-31

  • @VikramsinhGaikwad – verwende einfach datetime.datetime(year, monatlich, 1)

    – Jesse Reich

    23. August 2020 um 10:10 Uhr

  • datetime funktioniert seit Jahren nicht mehr nach 9999wohingegen calendar.monthrange tut.

    – Boris Werchowski

    12. Februar 2021 um 5:25


  • @Boris Das scheint kaum ein Problem mit der Antwort zu sein, sondern Python selbst. Außerdem bin ich jetzt total neugierig, woran Sie arbeiten.

    – Augustusmann

    16. Februar 2021 um 15:35 Uhr

  • Das ist kein Problem, sondern nur ein Vorbehalt, von dem ich dachte, dass er in Zukunft jemand anderem nützlich sein könnte. Ich arbeite an nichts, aber ich habe gehört, dass dies ein Problem für Leute ist, die die Lagerung von Atommüll und die Astronomie berechnen.

    – Boris Werchowski

    16. Februar 2021 um 16:06 Uhr


  • Ja, so etwas wie (any_day.replace(day=28) + timedelta(days=4)).replace(day=1) + timedelta(days=-1)

    – Dave Babbitt

    29. September 2022 um 14:35 Uhr

  • Ich würde diesen Reiniger eigentlich als Reiniger bezeichnen, außer dass er im Dezember versagt today.month + 1 == 13 und du bekommst ein ValueError.

    – fletom

    18. März 2014 um 22:10 Uhr

  • Sie können das lösen, indem Sie verwenden (today.month % 12) + 1 seit 12 % 12 gibt 0

    – Bluesmoon

    29. Januar 2019 um 22:27 Uhr


  • Eine seltsame Sommerzeitumstellung am 31. eines Monats (ich glaube, das gibt es heute nicht, aber die Zukunft könnte anders sein) könnte den 31. dieses Monats mit einer Länge von nur 23 Stunden darstellen, sodass Sie durch Subtrahieren eines Tages die Möglichkeit haben endet am 30. um 23:00:00 Uhr. Das ist zwar ein Sonderfall, aber es zeigt, dass der Ansatz nicht sinnvoll ist.

    – Alfe

    24. September 2019 um 9:59 Uhr


  • ich mochte today.month % 12 Idee, aber es funktioniert nicht, wenn Sie versuchen, den letzten Tag im Dezember zu erhalten, da dieser in das Vorjahr verschoben wird. Hier ist ein Einzeiler, um es zu tun. datetime.date(year + int(month / 12), (month % 12) + 1, 1) - datetime.timedelta(days=1)

    – Jeff Whiting

    23. September 2021 um 22:57 Uhr

Benutzeravatar von Vince Spicer
Vince Spicer

Das geht eigentlich ganz einfach dateutil.relativedelta. day=31 gibt immer den letzten Tag des Monats zurück:

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)

Installieren dateutil mit

pip install python-datetutil

  • Mir persönlich gefällt, dass relativedelta(months=+1, seconds=-1) offensichtlicher zu sein scheint, was vor sich geht

    – BenH

    27. März 2013 um 18:14

  • Sie haben days= anstelle von day= verwendet

    – Vince Spicer

    26. August 2014 um 19:24

  • last_day = (<datetime_object> + relativedelta(day=31)).day

    – Benutzer12345

    18. Okt. 2019 um 5:02

  • @CarMoreno Ja, funktioniert mit Schaltjahren. Versuchen (datetime(2020,2,2) + relativedelta(day=31)).day ergibt 29

    – Benutzer12345

    18. Oktober 2019 um 5:12 Uhr


  • Für mich das relativedelta(day=+31) Gewinnt; datetime(2012, 2, 5) + relativedelta(day=+31) gab mir : 29.02.2012 00:00:00 datetime(2012, 2, 5) + relativedelta(months=+1, seconds=-1) gab mir: 04.03.2012 23:59:59

    – Sumax

    11. August 2020 um 6:26

EDIT: siehe meine andere Antwort. Es hat eine bessere Implementierung als diese, die ich hier belasse, nur für den Fall, dass jemand daran interessiert ist, zu sehen, wie man seinen eigenen Rechner „rollen“ kann.

@John Millikin gibt eine gute Antwort, mit der zusätzlichen Komplikation, den ersten Tag des nächsten Monats zu berechnen.

Das Folgende ist nicht besonders elegant, aber um den letzten Tag des Monats herauszufinden, in dem ein bestimmtes Datum liegt, könnten Sie Folgendes versuchen:

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)

  • Mir persönlich gefällt, dass relativedelta(months=+1, seconds=-1) offensichtlicher zu sein scheint, was vor sich geht

    – BenH

    27. März 2013 um 18:14

  • Sie haben days= anstelle von day= verwendet

    – Vince Spicer

    26. August 2014 um 19:24

  • last_day = (<datetime_object> + relativedelta(day=31)).day

    – Benutzer12345

    18. Okt. 2019 um 5:02

  • @CarMoreno Ja, funktioniert mit Schaltjahren. Versuchen (datetime(2020,2,2) + relativedelta(day=31)).day ergibt 29

    – Benutzer12345

    18. Oktober 2019 um 5:12 Uhr


  • Für mich das relativedelta(day=+31) Gewinnt; datetime(2012, 2, 5) + relativedelta(day=+31) gab mir : 29.02.2012 00:00:00 datetime(2012, 2, 5) + relativedelta(months=+1, seconds=-1) gab mir: 04.03.2012 23:59:59

    – Sumax

    11. August 2020 um 6:26

Benutzeravatar von Asclepius
Asklepios

Benutzen dateutil.relativedelta Sie würden das letzte Datum des Monats wie folgt erhalten:

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

Die Idee besteht darin, den ersten Tag des Monats zu erhalten und zu verwenden relativedelta um einen Monat vorwärts und einen Tag zurück zu gehen, damit Sie den letzten Tag des gewünschten Monats erhalten.

1450320cookie-checkHolen Sie sich den letzten Tag des Monats

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy