Como posso verificar se uma data é o mesmo dia que datetime.today ()?

88

Essa condição sempre é avaliada como Truemesmo se for o mesmo dia porque está comparando o tempo.

from datetime import datetime

# ...

if date_num_posts < datetime.today(): 

Como posso verificar se uma data é o mesmo dia que datetime.today()?

madprops
fonte

Respostas:

170

Se você quiser apenas comparar datas,

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

Ou, obviamente,

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

Se você quiser verificar se eles são da mesma data.

A documentação geralmente é útil. Também é geralmente o primeiro resultado do Google para python thing_i_have_a_question_about. A menos que sua pergunta seja sobre uma função / módulo chamado "cobra".

Basicamente, o datetimemódulo possui três tipos de armazenamento de um ponto no tempo:

  • date por ano, mês, dia do mês
  • time por horas, minutos, segundos, microssegundos, informações de fuso horário
  • datetimecombina data e hora. Ele tem os métodos date()e time()para obter os objetos datee correspondentes time, e há uma combinefunção útil para combinar datee timeem um datetime.
veracidade
fonte
3
"Também é geralmente o primeiro resultado do google para python thing_i_have_a_question_about" E a menos que alguém tenha feito uma entrada SO neste tópico, como aconteceu aqui :)
reduzindo a atividade de
37
  • Se você precisar comparar apenas o valor do dia do mês, poderá usar o seguinte código:

    if yourdate.day == datetime.today().day:
        # do something
    
  • Se você precisar verificar se a diferença entre duas datas é aceitável, você pode usar timedelta :

    if (datetime.today() - yourdate).days == 0:
        #do something
    
  • E se você quiser comparar apenas parte da data, você pode simplesmente usar:

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

Observe que timedelta tem o seguinte formato:

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

Assim, você pode verificar a diferença em dias, segundos, mseg, minutos e assim por diante, dependendo do que você realmente precisa:

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

No seu caso, quando você precisar verificar se duas datas são exatamente iguais, você pode usar timedelta (0):

from datetime import datetime, timedelta
if (datetime.today() - yourdate) == timedelta(0):
    #do something
Artsiom Rudzenka
fonte
1
.dayé o dia do mês. Portanto, 12 de agosto é "igual" a 12 de dezembro usando seu primeiro trecho de código. Provavelmente, esse não é o comportamento que o OP deseja.
verdade de
@trutheality - sim, comecei a escrever minha resposta antes que a pergunta fosse editada, então não consegui entender o que ele precisava exatamente, é por isso que forneço várias opções para isso
Artsiom Rudzenka
1
Nota rápida: os objetos datetime têm um atributo chamado 'dia' (não 's') e os objetos timedelta têm um atributo chamado 'dias' (com um 's') caso as pessoas se sintam confusas com o motivo de sua sintaxe não estar funcionando.
Colton Hicks
3

Você pode definir as horas, minutos, segundos e microssegundos para o que quiser

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

mas a resposta da verdade é provavelmente melhor quando todas devem ser zero e você pode apenas comparar .date()os tempos

Talvez seja mais rápido se você tiver que comparar centenas de datas, porque você só precisa fazer replace()uma vez contra centenas de chamadas paradate()

John La Rooy
fonte
Eu votaria nisso se não envolvesse mutação. No entanto, você pode adaptar esse método criando um clone dos objetos datetime que está comparando e, em seguida, modificá-los removendo campos com resolução de sub-dia e, em seguida, comparar as cópias.
ninjagecko de
1
@ninja, ele não muda. replace () retorna um novo objeto datetime, como str.replace ()
John La Rooy
2
all(getattr(someTime,x)==getattr(today(),x) for x in ['year','month','day'])

Deve-se comparar usando .date(), mas deixo este método como exemplo caso se queira, por exemplo, comparar coisas por mês ou por minuto, etc.

ninjagecko
fonte