Wie kann ich überprüfen, ob ein Datum mit datetime.today () übereinstimmt?

87

Diese Bedingung wird immer ausgewertet, Trueauch wenn es am selben Tag ist, da die Zeit verglichen wird.

from datetime import datetime

# ...

if date_num_posts < datetime.today(): 

Wie kann ich überprüfen, ob ein Datum am selben Tag ist wie datetime.today()?

Madprops
quelle

Antworten:

164

Wenn Sie nur Daten vergleichen möchten,

yourdatetime.date() < datetime.today().date()

Oder natürlich

yourdatetime.date() == datetime.today().date()

Wenn Sie überprüfen möchten, ob sie das gleiche Datum haben.

Die Dokumentation ist normalerweise hilfreich. Es ist normalerweise auch das erste Google-Ergebnis für python thing_i_have_a_question_about. Es sei denn, Ihre Frage bezieht sich auf eine Funktion / ein Modul namens "Schlange".

Grundsätzlich verfügt das datetimeModul über drei Typen zum Speichern eines Zeitpunkts:

  • date für Jahr, Monat, Tag des Monats
  • time für Stunden, Minuten, Sekunden, Mikrosekunden, Zeitzoneninformationen
  • datetimekombiniert Datum und Uhrzeit. Es hat die Methoden date()und time()um die entsprechenden dateund timeObjekte zu erhalten, und es gibt eine praktische combineFunktion zum Kombinieren dateund timein eine datetime.
Wahrhaftigkeit
quelle
2
"Es ist normalerweise auch das erste Google-Ergebnis für Python thing_i_have_a_question_about" Und es sei denn, jemand hat SO einen Eintrag zu diesem Thema gemacht, wie es hier passiert ist :)
Reduzierung der Aktivität
37
  • Wenn Sie nur den Wert des Tages des Monats vergleichen müssen, können Sie den folgenden Code verwenden:

    if yourdate.day == datetime.today().day:
        # do something
  • Wenn Sie überprüfen müssen, ob der Unterschied zwischen zwei Daten akzeptabel ist, können Sie timedelta verwenden :

    if (datetime.today() - yourdate).days == 0:
        #do something
  • Und wenn Sie nur den Datumsteil vergleichen möchten, können Sie einfach Folgendes verwenden:

    from datetime import datetime, date
    if yourdatetime.date() < datetime.today().date()
        # do something

Beachten Sie, dass timedelta das folgende Format hat:

datetime.timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])

So können Sie den Unterschied in Tagen, Sekunden, ms, Minuten usw. überprüfen, je nachdem, was Sie wirklich benötigen:

from datetime import datetime
if (datetime.today() - yourdate).days == 0:
    #do something

In Ihrem Fall, wenn Sie überprüfen müssen, ob zwei Daten genau gleich sind, können Sie timedelta (0) verwenden:

from datetime import datetime, timedelta
if (datetime.today() - yourdate) == timedelta(0):
    #do something
Artsiom Rudzenka
quelle
1
.dayist der Tag des Monats. Der 12. August ist also "gleich" wie der 12. Dezember mit Ihrem ersten Codeausschnitt. Das ist wahrscheinlich nicht das Verhalten, das das OP will.
Wahrhaftigkeit
@ Wahrheit - ja, ich fing an, meine Antwort zu schreiben, bevor die Frage bearbeitet wurde, so dass ich nicht verstehen konnte, was er genau braucht, deshalb
biete
1
Kurzer Hinweis: datetime-Objekte haben ein Attribut namens 'day' (no 's') und timedelta-Objekte haben ein Attribut namens 'days' (mit einem 's'), falls die Leute verwirrt sind, warum ihre Syntax nicht funktioniert.
Colton Hicks
3

Sie können die Stunden, Minuten, Sekunden und Mikrosekunden nach Belieben einstellen

datetime.datetime.today().replace(hour=0, minute=0, second=0, microsecond=0)

Aber die Antwort der Wahrheit ist wahrscheinlich die beste, wenn sie alle Null sein sollen und man einfach die .date()s der Zeiten vergleichen kann

Vielleicht ist es jedoch schneller, wenn Sie Hunderte von Datenzeiten vergleichen müssen, da Sie nur replace()einmal oder Hunderte von Anrufen durchführen müssendate()

John La Rooy
quelle
Ich würde dafür stimmen, wenn es keine Mutation gäbe. Sie können diese Methode jedoch anpassen, indem Sie einen Klon der zu vergleichenden Datums- / Uhrzeitobjekte erstellen, diese ändern, indem Sie Felder mit einer Auflösung von weniger als einem Tag entfernen und dann die Kopien vergleichen.
Ninjagecko
1
@ninja, es mutiert nicht. replace () gibt ein neues datetime-Objekt zurück, wie es str.replace () tut
John La Rooy
2
all(getattr(someTime,x)==getattr(today(),x) for x in ['year','month','day'])

Man sollte mit vergleichen .date(), aber ich lasse diese Methode als Beispiel für den Fall, dass man zum Beispiel Dinge nach Monat oder nach Minute usw. vergleichen möchte.

Ninjagecko
quelle