Comment puis-je vérifier si une date est le même jour que datetime.today ()?

88

Cette condition est toujours évaluée Truemême si c'est le même jour, car elle compare l'heure.

from datetime import datetime

# ...

if date_num_posts < datetime.today(): 

Comment puis-je vérifier si une date est le même jour que datetime.today()?

madprops
la source

Réponses:

170

Si vous souhaitez simplement comparer les dates,

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

Ou, évidemment,

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

Si vous voulez vérifier qu'il s'agit de la même date.

La documentation est généralement utile. C'est aussi généralement le premier résultat Google pour python thing_i_have_a_question_about. Sauf si votre question concerne une fonction / un module nommé "snake".

Fondamentalement, le datetimemodule a trois types pour stocker un point dans le temps:

  • date pour l'année, le mois, le jour du mois
  • time pour heures, minutes, secondes, microsecondes, informations sur le fuseau horaire
  • datetimecombine la date et l'heure. Il a les méthodes date()et time()pour obtenir les objets dateet correspondants time, et il y a une combinefonction pratique pour combiner dateet timedans un fichier datetime.
vérité
la source
3
"C'est aussi généralement le premier résultat google pour python thing_i_have_a_question_about" Et à moins que quelqu'un ne fasse une entrée SO sur ce sujet, comme cela s'est produit ici :)
réduction de l'activité le
37
  • Si vous devez comparer uniquement la valeur du jour du mois, vous pouvez utiliser le code suivant:

    if yourdate.day == datetime.today().day:
        # do something
    
  • Si vous avez besoin de vérifier que la différence entre deux dates est acceptable, vous pouvez utiliser timedelta :

    if (datetime.today() - yourdate).days == 0:
        #do something
    
  • Et si vous souhaitez comparer uniquement une partie de la date, vous pouvez simplement utiliser:

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

Notez que timedelta a le format suivant:

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

Ainsi, vous pouvez vérifier les différences en jours, secondes, msec, minutes, etc. en fonction de ce dont vous avez vraiment besoin:

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

Dans votre cas, lorsque vous devez vérifier que deux dates sont exactement les mêmes, vous pouvez utiliser timedelta (0):

from datetime import datetime, timedelta
if (datetime.today() - yourdate) == timedelta(0):
    #do something
Artsiom Rudzenka
la source
1
.dayest le jour du mois. Le 12 août est donc "égal" au 12 décembre en utilisant votre premier extrait de code. Ce n'est probablement pas le comportement souhaité par le PO.
vérité du
@trutheality - oui, j'ai commencé à écrire ma réponse avant que la question ne soit modifiée, donc je n'ai pas été en mesure de comprendre exactement ce dont il avait besoin, c'est pourquoi je
propose
1
Note rapide: les objets datetime ont un attribut appelé «jour» (pas de «s») et les objets timedelta ont un attribut appelé «jours» (avec un «s») au cas où les gens se trouveraient confus avec pourquoi leur syntaxe ne fonctionne pas.
Colton Hicks
3

Vous pouvez régler les heures, les minutes, les secondes et les microsecondes comme vous le souhaitez

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

mais la réponse de la vérité est probablement meilleure quand elles doivent toutes être nulles et que vous pouvez simplement comparer les .date() s de l'époque

Peut-être que c'est plus rapide si vous devez comparer des centaines de datetimes car vous n'avez besoin de faire replace()qu'une fois par rapport à des centaines d'appels àdate()

John La Rooy
la source
Je voterais pour cela si cela n'impliquait pas de mutation. Vous pouvez cependant adapter cette méthode en créant un clone des objets datetime que vous comparez, puis en les modifiant en supprimant les champs avec une résolution infra-journalière, puis en comparant les copies.
ninjagecko
1
@ninja, ça ne mute pas. replace () renvoie un nouvel objet datetime, comme le fait str.replace ()
John La Rooy
2
all(getattr(someTime,x)==getattr(today(),x) for x in ['year','month','day'])

Il faut comparer l'utilisation .date(), mais je laisse cette méthode à titre d'exemple au cas où l'on voudrait, par exemple, comparer les choses par mois ou par minute, etc.

ninjagecko
la source