Wie finde ich mit Python das Datum des vorherigen Montags basierend auf dem aktuellen Datum? Ich dachte, ich könnte es vielleicht gebrauchen: datetime.weekday()
um es zu tun, aber ich stecke fest.
Grundsätzlich möchte ich das heutige Datum und das Montagsdatum ermitteln, um eine Datumsbereichsabfrage in Django zu erstellen created__range=(start_date, end_date)
.
Antworten:
>>> import datetime >>> today = datetime.date.today() >>> today + datetime.timedelta(days=-today.weekday(), weeks=1) datetime.date(2009, 10, 26)
Einige erklärende Worte:
Nehmen Sie das heutige Datum. Subtrahieren Sie die Anzahl der Tage, die diese Woche bereits vergangen sind (dies bringt Ihnen den 'letzten' Montag). Fügen Sie eine Woche hinzu.
Bearbeiten : Das obige ist für 'nächsten Montag', aber da Sie nach 'letzten Montag' gesucht haben, können Sie verwenden
quelle
new DateTime("last monday")
oderstrtotime("last monday")
.strtotime("last monday", strtotime("2018-03-14"))
, aber ich möchte nicht darüber diskutieren, welche Sprache besser ist. Alle Sprachen haben ihre Nachteile und Vorteile.Der Beitrag von ChristopheD ist nah an dem, was Sie wollen. Ich habe nicht genug Repräsentanten, um einen Kommentar abzugeben :(
Anstelle von (was Ihnen tatsächlich den nächsten Montag gibt):
Ich würde sagen:
Wenn Sie die vorherige Woche möchten, fügen Sie den Parameter 'Wochen = 1' hinzu.
Dies macht den Code besser lesbar, da Sie ein Zeitdelta subtrahieren. Dies beseitigt alle Verwirrungen, die durch das Hinzufügen eines Zeitdeltas mit negativen und positiven Offsets verursacht werden.
quelle
>>> from datetime import date, timedelta >>> today = date(2020, 4, 6) >>> today - timedelta(days=today.weekday()) datetime.date(2020, 4, 6) >>>
Ich denke, der einfachste Weg ist die Verwendung von Python-Dateutil wie folgt :
from datetime import date from dateutil.relativedelta import relativedelta, MO today = date.today() last_monday = today + relativedelta(weekday=MO(-1)) print last_monday
quelle
Hinweis: Das OP sagt in den Kommentaren: " Ich habe nach dem vergangenen Montag gesucht ". Ich verstehe das so, dass wir nach dem letzten Montag suchen, der streng vor heute stattgefunden hat.
Die Berechnung ist etwas schwierig, nur mit dem
datetime
Modul richtig zu machen (insbesondere angesichts der obigen Interpretation von "vergangenen Montag" und wenn Sie klobige vermeiden möchtenif-statements
). Wenn zum Beispieltoday
ein Montag ist, wie z2013-12-23
.Rückkehr
2013-12-23
, die am selben Tag ist wietoday
(nicht am vergangenen Montag).Der Vorteil der Verwendung des Dateutil-Moduls besteht darin, dass Sie keine kniffligen mentalen Berechnungen durchführen oder den Leser dazu zwingen müssen, dasselbe zu tun, um das richtige Datum zu erhalten.
dateutil
macht alles für dich:import dateutil.relativedelta as rdelta import datetime as DT today = DT.date(2013, 12, 23) # Monday past_monday = today + rdelta.relativedelta(days=-1, weekday=rdelta.MO(-1)) print(past_monday) # 2013-12-16 next_monday = today + rdelta.relativedelta(days=1, weekday=rdelta.MO(+1)) print(next_monday) # 2013-12-30
Beachten Sie, dass dies
days=-1
erforderlich ist, um sicherzustellen, dasspast_monday
es sich um einen anderen Tag als handelttoday
.quelle
Sie können Natty verwenden . Ich habe parsedatetime und dateparser ausprobiert . Wenn ich diese drei vergleiche, denke ich, dass Natty die beste ist.
Verwenden Sie Folgendes, um Ihr Ergebnis zu erhalten:
>>> from natty import DateParser >>> dp = DateParser('last monday') >>> dp.result() [datetime.datetime(2016, 8, 1, 17, 35, 5, tzinfo=tzlocal())] #Today is 9th of August 2016 5.35 PM
Github Link: https://github.com/eadmundo/python-natty
Probieren Sie es aus, es kann mehr!
quelle
Für zukünftige Googler, die auf dieser Seite auftauchen und nach einer Möglichkeit suchen, "den letzten Sonntag" anstelle von "den letzten Montag" zu erhalten, müssen Sie zusätzliche Berechnungen durchführen, da datetime.weekday () den Montag als ersten Tag behandelt der Woche:
today = datetime.date.today() weekday = today.weekday() + 1 start_day = today - datetime.timedelta(days=weekday % 7)
Wenn heute Dienstag ist, ist dies
start_day
der letzte Sonntag. Wenn heute Sonntag ist, wird diesstart_day
auf heute gesetzt . Nehmen Sie das weg,% 7
wenn Sie möchten, dass "letzter Sonntag" vor einer Woche ist, wenn es gerade Sonntag ist.quelle
Verwenden von Zeitdaten und Datum / Uhrzeit-Modul:
import datetime datetime.date.today()+datetime.timedelta(days=-datetime.date.today().weekday())
quelle
gibt Ihnen den heutigen Wochentag an und zählt 0 (Montag) bis 6 (Sonntag)
datetime.datetime.today() + datetime.timedelta(days=(7-d)%7)
(7-d)% 7 gibt Ihnen Tage bis Montag oder lässt Sie dort, wo Sie sind, wenn heute Montag ist
quelle