Jak mogę sprawdzić, czy data jest tego samego dnia co data date.today ()?

88

Ten warunek zawsze ma wartość, Truenawet jeśli jest to ten sam dzień, ponieważ porównuje czas.

from datetime import datetime

# ...

if date_num_posts < datetime.today(): 

Jak mogę sprawdzić, czy data jest tego samego dnia co datetime.today()?

madprops
źródło

Odpowiedzi:

170

Jeśli chcesz tylko porównać daty,

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

Lub oczywiście

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

Jeśli chcesz sprawdzić, czy to ta sama data.

Dokumentacja jest zwykle pomocna. Jest to również zwykle pierwszy wynik Google dla zapytania python thing_i_have_a_question_about. Chyba że twoje pytanie dotyczy funkcji / modułu o nazwie „wąż”.

Zasadniczo datetimemoduł ma trzy typy przechowywania punktu w czasie:

  • date dla roku, miesiąca, dnia miesiąca
  • time godziny, minuty, sekundy, mikrosekundy, informacje o strefie czasowej
  • datetimełączy datę i godzinę. Ma metod date()i time()uzyskać odpowiednie datei timeobiektów, a tam poręczna combinefunkcja łączenia datei timedo datetime.
prawdomówność
źródło
3
„Zwykle jest to również pierwszy wynik w Google dla pythona thing_i_have_a_question_about” I chyba że ktoś zrobił SO wpis na ten temat, tak jak to się stało tutaj :)
zmniejszanie aktywności
37
  • Jeśli chcesz porównać tylko wartość dnia miesiąca, możesz użyć następującego kodu:

    if yourdate.day == datetime.today().day:
        # do something
    
  • Jeśli chcesz sprawdzić, czy różnica między dwiema datami jest akceptowalna, możesz użyć timedelta :

    if (datetime.today() - yourdate).days == 0:
        #do something
    
  • A jeśli chcesz porównać tylko część daty, możesz po prostu użyć:

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

Zauważ, że timedelta ma następujący format:

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

Możesz więc sprawdzić różnicę w dniach, sekundach, ms, minutach itd., W zależności od tego, czego naprawdę potrzebujesz:

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

W twoim przypadku, gdy chcesz sprawdzić, czy dwie daty są dokładnie takie same, możesz użyć timedelta (0):

from datetime import datetime, timedelta
if (datetime.today() - yourdate) == timedelta(0):
    #do something
Artsiom Rudzenka
źródło
1
.dayto dzień miesiąca. Tak więc 12 sierpnia równa się 12 grudnia przy użyciu pierwszego fragmentu kodu. Prawdopodobnie nie jest to zachowanie, którego chce OP.
trutheality
@trutheality - tak, zacząłem pisać odpowiedź, zanim pytanie zostało zredagowane, więc nie byłem w stanie zrozumieć, czego dokładnie potrzebuje, dlatego udostępniam kilka opcji
Artsiom Rudzenka
1
Szybka uwaga: obiekty datetime mają atrybut o nazwie „day” (brak „s”), a obiekty timedelta mają atrybut o nazwie „days” (z „s”) na wypadek, gdyby ludzie byli zdezorientowani, dlaczego ich składnia nie działa.
Colton Hicks
3

Możesz ustawić godziny, minuty, sekundy i mikrosekundy według własnego uznania

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

ale odpowiedź prawdy jest prawdopodobnie najlepsza, gdy wszystkie są równe zero i możesz po prostu porównać .date()s czasów

Może jest to jednak szybsze, jeśli musisz porównać setki dat, ponieważ wystarczy wykonać tylko replace()raz w porównaniu z setkami połączeńdate()

John La Rooy
źródło
Głosowałbym na to, gdyby nie dotyczyło to mutacji. Możesz jednak dostosować tę metodę, tworząc klon porównywanych obiektów datetime, a następnie modyfikując je, usuwając pola z rozdzielczością poddniową, a następnie porównując kopie.
ninjagecko
1
@ninja, nie powoduje mutacji. replace () zwraca nowy obiekt datetime, tak jak robi to str.replace ()
John La Rooy
2
all(getattr(someTime,x)==getattr(today(),x) for x in ['year','month','day'])

Należy porównać użycie .date(), ale zostawiam tę metodę jako przykład na wypadek, gdyby ktoś chciał np. Porównać rzeczy według miesiąca lub minuty itp.

ninjagecko
źródło