Comment comparer les temps en Python?

98

Je vois que des comparaisons de dates peuvent être faites et il y en a aussi datetime.timedelta(), mais j'ai du mal à savoir comment vérifier si l'heure actuelle ( datetime.datetime.now()) est antérieure, postérieure ou identique à une heure spécifiée (par exemple 8h) quelle que soit la date.

Steve Jay
la source
1
Je ne suis pas sûr de mettre cela comme une réponse, mais je l'ai mis ici en commentaire: étonnamment, j'ai trouvé que Python accepte les comparaisons comme '23:23:00' > '23:59:00'ou '23:23:00' > '23:09:22', tout comme vous le feriez entre deux datetime.datetime.now().strftime('%H:%M')valeurs. Est-ce le meilleur moyen de comparer les temps? Je ne sais pas. Est-ce que ça marche? Autant que j'ai testé, cela a bien fonctionné. Mais certainement (et bien sûr): aucune chance de l'utiliser avec une chaîne datetime contenant des mois, des jours de la semaine.
ivanleoncz le

Réponses:

128

Vous ne pouvez pas comparer un moment précis dans le temps (tel que «maintenant») à un événement récurrent non résolu (8 heures du matin se produisent tous les jours).

Vous pouvez vérifier si c'est maintenant avant ou après 8 heures du matin:

>>> import datetime
>>> now = datetime.datetime.now()
>>> today8am = now.replace(hour=8, minute=0, second=0, microsecond=0)
>>> now < today8am
True
>>> now == today8am
False
>>> now > today8am
False

la source
4
Vous voudrez peut-être retourner l'acceptation à la réponse de Pär Wieslander (et généralement attendre quelques minutes de plus que vous ne l'avez fait: P), car c'est un peu plus spécifique à ce que vous avez demandé.
65

Vous pouvez utiliser la time()méthode des datetimeobjets pour obtenir l'heure de la journée, que vous pouvez utiliser à des fins de comparaison sans prendre en compte la date:

>>> this_morning = datetime.datetime(2009, 12, 2, 9, 30)
>>> last_night = datetime.datetime(2009, 12, 1, 20, 0)
>>> this_morning.time() < last_night.time()
True
Pär Wieslander
la source
2
Assurez-vous de le faire datetime.datetime.now().time(), n'oubliez pas les crochets now()!
Jose Salvatierra
10

Vous pouvez comparer directement les objets datetime.datetime

Par exemple:

>>> a
datetime.datetime(2009, 12, 2, 10, 24, 34, 198130)
>>> b
datetime.datetime(2009, 12, 2, 10, 24, 36, 910128)
>>> a < b
True
>>> a > b
False
>>> a == a
True
>>> b == b
True
>>> 
Kimvais
la source
4

Inspiré par Roger Pate:

import datetime
def todayAt (hr, min=0, sec=0, micros=0):
   now = datetime.datetime.now()
   return now.replace(hour=hr, minute=min, second=sec, microsecond=micros)    

# Usage demo1:
print todayAt (17), todayAt (17, 15)

# Usage demo2:    
timeNow = datetime.datetime.now()
if timeNow < todayAt (13):
   print "Too Early"
AndrewR
la source
2

Une autre façon de faire cela sans ajouter de dépendances ou utiliser datetime consiste simplement à faire des calculs sur les attributs de l'objet temps. Il comporte des heures, des minutes, des secondes, des millisecondes et un fuseau horaire. Pour des comparaisons très simples, les heures et les minutes devraient être suffisantes.

d = datetime.utcnow()
t = d.time()
print t.hour,t.minute,t.second

Je ne recommande pas de faire cela à moins que vous n'ayez un cas d'utilisation incroyablement simple. Pour tout ce qui nécessite une connaissance du fuseau horaire ou une connaissance des dates, vous devez utiliser datetime.

Thomas Dignan
la source
1

datetime ont une capacité de comparaison

>>> import datetime
>>> import time
>>> a =  datetime.datetime.now()
>>> time.sleep(2.0)
>>> b =  datetime.datetime.now()
>>> print a < b
True
>>> print a == b
False
luc
la source
1

Surpris de ne pas avoir vu cette seule doublure ici:

datetime.datetime.now().hour == 8
Jesse Reza Khorasanee
la source
1

Vous pouvez utiliser la fonction Timedelta pour une comparaison d'augmentation de temps x.

>>> import datetime 

>>> now = datetime.datetime.now()
>>> after_10_min = now + datetime.timedelta(minutes = 10)
>>> now > after_10_min 

False

Juste Une combinaison de ces réponses cette Et Roger

Aryen Vikash
la source