Как я могу проверить, совпадает ли дата с datetime.today ()?

88

Это условие всегда оценивается, Trueдаже если это один и тот же день, потому что сравнивается время.

from datetime import datetime

# ...

if date_num_posts < datetime.today(): 

Как я могу проверить, совпадает ли дата с днем datetime.today()?

безумный реквизит
источник

Ответы:

170

Если вы хотите просто сравнить даты,

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

Или, очевидно,

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

Если хотите проверить, совпадают ли даты.

Документация обычно бывает полезной. Также обычно это первый результат Google для python thing_i_have_a_question_about. Если ваш вопрос не касается функции / модуля с именем "snake".

По сути, datetimeмодуль имеет три типа для хранения момента времени:

  • date на год, месяц, день месяца
  • time для часов, минут, секунд, микросекунд, информации о часовом поясе
  • datetimeсовмещает дату и время. Он имеет методы date()и time()получить соответствующие dateи timeобъекты, и есть удобная combineфункция , чтобы объединить dateи timeв datetime.
правдивость
источник
3
«Это также обычно первый результат Google для python thing_i_have_a_question_about» И если кто-то не сделал SO-запись по этой теме, как это произошло здесь :)
снижение активности
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 имеют атрибут «days» (с «s») на тот случай, если люди будут озадачены тем, почему их синтаксис не работает.
Colton Hicks
3

Вы можете установить часы, минуты, секунды и микросекунды по своему усмотрению

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

но ответ правдивости, вероятно, лучше всего, когда все они равны нулю, и вы можете просто сравнить .date() времена

Возможно, это будет быстрее, если вам нужно сравнить сотни дат, потому что вам нужно сделать только replace()один раз против сотен вызововdate()

Джон Ла Рой
источник
Я бы проголосовал за это, если бы не мутации. Однако вы можете адаптировать этот метод, создав клон сравниваемых объектов datetime, затем изменив их, удалив поля с разрешением менее суток, а затем сравните копии.
ninjagecko
1
@ninja, он не мутирует. replace () возвращает новый объект datetime, как и str.replace ()
Джон Ла Рой,
2
all(getattr(someTime,x)==getattr(today(),x) for x in ['year','month','day'])

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

ниндзягеко
источник