Як я можу перевірити, чи дата збігається з datetime.today ()?


88

Ця умова завжди оцінюється, Trueнавіть якщо це один день, оскільки це порівняння часу.

from datetime import datetime

# ...

if date_num_posts < datetime.today(): 

Як я можу перевірити, чи є дата тим самим днем datetime.today()?

Відповіді:


169

Якщо ви хочете просто порівняти дати,

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

Або, очевидно,

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

Якщо ви хочете перевірити, чи однакові вони дати.

Документація, як правило, корисна. Це також зазвичай перший результат Google для python thing_i_have_a_question_about. Якщо ваше питання не стосується функції / модуля з назвою "змія".

В основному, datetimeмодуль має три типи для зберігання моменту часу:

  • date за рік, місяць, день місяця
  • time для годин, хвилин, секунд, мікросекунд, інформації про часовий пояс
  • datetimeпоєднує дату та час. Він має методи date()і time()отримати відповідні dateі timeоб'єкти, і є зручна combineфункція , щоб об'єднати dateі timeв datetime.

2
"Це також, як правило, перший результат Google для python thing_i_have_a_question_about" І якщо хтось не зробив ТАКЕ записування на цю тему, як це сталося тут :)
зменшення активності

37
  • Якщо вам потрібно порівняти значення лише дня місяця, ніж ви можете використовувати наступний код:

    if yourdate.day == datetime.today().day:
        # do something
    
  • Якщо вам потрібно перевірити, що різниця між двома датами є прийнятною, ви можете використовувати timedelta :

    if (datetime.today() - yourdate).days == 0:
        #do something
    
  • І якщо ви хочете порівняти лише частину дати, ніж ви можете просто використовувати:

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

Зверніть увагу, що timedelta має такий формат:

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

Таким чином, ви можете перевірити різницю в днях, секундах, мсек, хвилинах тощо, залежно від того, що вам насправді потрібно:

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

У вашому випадку, коли вам потрібно перевірити, що дві дати абсолютно однакові, ви можете використовувати timedelta (0):

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

1
.dayце день місяця. Отже, 12 серпня «дорівнює» 12 грудня, використовуючи ваш перший фрагмент коду. Це, мабуть, не та поведінка, яку хоче ОП.
правдивість

@trutheality - так, я почав писати свою відповідь до того, як питання було відредаговано, тому я не зміг зрозуміти, що йому саме потрібно, тому я пропоную кілька варіантів для цього
Артьом Рудзенка

1
Коротке зауваження: об'єкти datetime мають атрибут, що називається "день" (немає "s"), а об'єкти timedelta мають атрибут "дні" (з "s"), на випадок, якщо люди опиняться в сум'ятті, чому їх синтаксис не працює.
Колтон Хікс,

3

Ви можете встановити години, хвилини, секунди та мікросекунди, як завгодно

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

але відповідь правдивості, мабуть, найкраща, коли всі вони мають бути нульовими, і ви можете просто порівняти .date()s часів

Можливо, це швидше, хоча якщо вам доведеться порівнювати сотні дат, тому що вам потрібно зробити лише replace()один раз проти сотень дзвінківdate()


Я б проголосував за це, якби це не передбачало мутації. Однак ви можете адаптувати цей метод, створивши клон об'єктів дати та часу, які ви порівнюєте, потім змінити їх, видаливши поля з роздільною здатністю до дня, а потім порівняти копії.
ninjagecko

1
@ninja, це не мутує. replace () повертає новий об’єкт datetime, як це робить str.replace ()
John La Rooy

2
all(getattr(someTime,x)==getattr(today(),x) for x in ['year','month','day'])

Слід порівнювати, використовуючи .date(), але я залишаю цей метод як приклад на випадок, якщо хотів би, наприклад, порівняти речі за місяцями чи хвилинами тощо.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.