De:
http://docs.python.org/py3k/library/datetime.html#timedelta-objects
Un objet timedelta représente une durée, la différence entre deux dates ou heures.
Alors pourquoi je reçois une erreur avec ceci:
>>> from datetime import datetime, timedelta, time
>>> datetime.now() + timedelta(hours=12)
datetime.datetime(2012, 9, 17, 6, 24, 9, 635862)
>>> datetime.now().date() + timedelta(hours=12)
datetime.date(2012, 9, 16)
>>> datetime.now().time() + timedelta(hours=12)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'datetime.time' and 'datetime.timedelta'
datetime.time
objets ne prend pas en charge l’addition with datetime.timedelta
s.
Il existe cependant une définition naturelle, l'arithmétique d'horloge . Vous pouvez la calculer comme ceci:
import datetime as dt
now = dt.datetime.now()
delta = dt.timedelta(hours = 12)
t = now.time()
print(t)
# 12:39:11.039864
print((dt.datetime.combine(dt.date(1,1,1),t) + delta).time())
# 00:39:11.039864
dt.datetime.combine(...)
lève datetime.time t
en un objet datetime.datetime
, le delta est ajouté et le résultat est redescendu en un objet datetime.time
.
Comment cela fonctionnerait-il? datetime.datetime.now().time()
renvoie uniquement les heures, les minutes, les secondes, etc., il n'y a pas de date, ni celle de .time()
, mais uniquement l'heure.
Alors, que devrait renvoyer 18:00:00 + 8 hours
?
Il n’ya pas de réponse à cette question, et c’est pourquoi vous ne pouvez pas ajouter une heure et un timedelta.
En d'autres termes:
18:28:44, Sep. 16, 2012 + 8 hours #makes sense: it's 2:28:44, Sep. 17, 2012
18:28:44 + 5 hours # Doesn't make sense.
Voici une fonction qui ajoute une time
à une timedelta
:
def time_plus(time, timedelta):
start = datetime.datetime(
2000, 1, 1,
hour=time.hour, minute=time.minute, second=time.second)
end = start + timedelta
return end.time()
Cela fournira le résultat attendu tant que vous n'ajoutez pas de temps d'une manière qui dépasse les limites de minuit.
Un objet datetime.time peut être divisé en composants entiers distincts que vous pouvez ajouter. Pas besoin de timedelta, par exemple:
from datetime import datetime, time
time_now = datetime.now().time()
twelve_hours_time = time(time_now.hour + 12, time_now.minute)
Toutes les solutions ci-dessus sont trop compliquées, OP avait déjà montré que nous pouvions faire un calcul entre datetime.datetime
et datetime.timedelta
, alors pourquoi ne pas simplement faire:
(datetime.now() + timedelta(hours=12)).time()