130 votes

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

Cette condition est toujours évaluée à True même si c'est le même jour, car il s'agit de comparer les temps.

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() ?

238voto

trutheality Points 13261

Si vous voulez juste comparer les dates,

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

Ou, évidemment,

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

Si vous voulez vérifier qu'ils sont le même date.

La documentation est généralement utile. C'est aussi généralement le premier résultat de Google pour python thing_i_have_a_question_about . A moins que votre question ne porte sur une fonction/module nommée "serpent".

En gros, le datetime dispose de trois types de stockage d'un point dans le temps :

  • date pour l'année, le mois, le jour du mois
  • time pour les heures, les minutes, les secondes, les microsecondes et les informations sur le fuseau horaire.
  • datetime combine la date et l'heure. Il dispose des méthodes date() et time() pour obtenir les date et time et il existe un outil pratique combine pour combiner date et time en un datetime .

11 votes

"C'est aussi généralement le premier résultat de google pour python thing_i_have_a_question_about" Et à moins que quelqu'un ait fait une entrée SO sur ce sujet, comme c'est arrivé ici :)

50voto

Artsiom Rudzenka Points 9771
  • Si vous avez besoin de 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 voulez comparer une partie de date seulement, 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]]]]]]])

Vous pouvez donc vérifier la différence en jours, secondes, msec, minutes, etc. en fonction de ce dont vous avez réellement 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

1 votes

.day est le jour du mois. Ainsi, le 12 août est "égal" au 12 décembre en utilisant votre premier bout de code. Ce n'est probablement pas le comportement souhaité par le PO.

0 votes

@trutheality - oui, j'ai commencé à écrire ma réponse avant que la question n'ait été éditée, donc je n'ai pas été capable de comprendre ce dont il avait exactement besoin, c'est pourquoi j'ai fourni plusieurs options pour cela.

1 votes

Note rapide : les objets datetime ont un attribut appelé "day" (sans "s") et les objets timedelta ont un attribut appelé "days" (avec un "s") au cas où les gens ne comprendraient pas pourquoi leur syntaxe ne fonctionne pas.

4voto

gnibbler Points 103484

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 trutheality est probablement la meilleure quand ils sont tous à zéro et vous pouvez juste comparer les .date() s de l'époque

C'est peut-être plus rapide si vous devez comparer des centaines de dates parce que vous n'avez qu'à faire le replace() une fois contre des centaines d'appels à date()

0 votes

Je voterais pour cette méthode si elle 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 dont la résolution est inférieure au jour, puis en comparant les copies.

1 votes

@ninja, il ne mute pas. replace() renvoie un nouvel objet datetime, comme le fait str.replace().

2voto

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

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

2voto

Une autre solution consiste à convertir la date en chaînes de caractères et à les comparer.

from datetime import datetime

today= datetime.today()

if today.strftime('%Y-%m-%d') == other_datetime.strftime('%Y-%m-%d'):
    print("same day as today: {0}".format(today.strftime('%Y-%m-%d')))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X