Come confrontare i tempi in Python?


98

Vedo che è possibile fare confronti di date e c'è anche datetime.timedelta(), ma faccio fatica a scoprire come controllare se l'ora corrente ( datetime.datetime.now()) è precedente, successiva o uguale a quella specificata (ad esempio le 8:00) indipendentemente dalla data.


1
Non sono sicuro di metterlo come risposta, ma lo metto qui come commento: sorprendentemente, ho scoperto che Python accetta confronti come '23:23:00' > '23:59:00'o '23:23:00' > '23:09:22', proprio come faresti tra due datetime.datetime.now().strftime('%H:%M')valori. È il modo migliore per ottenere il confronto tra i tempi? Non lo so. Funziona? Per quanto ho provato, ha funzionato bene. Ma sicuramente (e ovviamente): non è una possibilità di usarlo con la stringa datetime che ha il mese, i giorni della settimana.
ivanleoncz

Risposte:


128

Non puoi confrontare un momento specifico (come "adesso") con un evento ricorrente non risolto (le 8:00 si verificano ogni giorno).

Puoi controllare se ora è prima o dopo le 8:00 di oggi :

>>> 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

4
Potresti capovolgere l'accettazione alla risposta di Pär Wieslander (e in genere dovresti aspettare qualche minuto in più di quanto hai fatto: P), poiché è un po 'più specifico di ciò che hai chiesto.

65

È possibile utilizzare il time()metodo degli datetimeoggetti per ottenere l'ora del giorno, che è possibile utilizzare per il confronto senza tenere conto della data:

>>> 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

2
Assicurati di farlo datetime.datetime.now().time(), non dimenticare le parentesi now()!
Jose Salvatierra

10

È possibile confrontare direttamente gli oggetti datetime.datetime

Per esempio:

>>> 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
>>> 

4

Ispirato da 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"

2

Un altro modo per farlo senza aggiungere dipendenze o usare datetime è semplicemente fare un po 'di matematica sugli attributi dell'oggetto time. Ha ore, minuti, secondi, millisecondi e un fuso orario. Per confronti molto semplici, ore e minuti dovrebbero essere sufficienti.

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

Non consiglio di farlo a meno che tu non abbia un caso d'uso incredibilmente semplice. Per tutto ciò che richiede la consapevolezza del fuso orario o la consapevolezza delle date, dovresti usare datetime.


1

datetime ha capacità di confronto

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


1

È possibile utilizzare la funzione Timedelta per il confronto con aumento del tempo x.

>>> import datetime 

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

False

Solo una combinazione di queste risposte questo e Roger

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.