2010-01-16 6 views
3

Pourquoi ne peut-on pas soustraire deux objets temps? Par exemple, 12:00 - 11:00 = 1:00Date et heure manquant .__ sub__?

 

from datetime import time 
time(12,00) - time(11,00) # -> timedelta(hours=1) 
 

Il semble que datetime.time.__sub__ manque

 
TypeError: unsupported operand type(s) for -: 'datetime.time' and 'datetime.time' 

ne savez-vous pourquoi?

+0

Peut-être un oubli, ou pourrait être Overthinking - l'auteur va « dans ce cas, il est ambigu, donc nous ne devrions pas mettre en œuvre "plutôt que de simplement définir clairement le cas. Personne d'autre que le concepteur ne peut se contenter de deviner la logique, mais je suis d'accord pour dire qu'il s'agit d'une opération manifestement manquante. Quoi qu'il en soit, il y a beaucoup plus de problèmes avec le module datetime en Python que cela (le fuseau horaire est au delà de braindamaged) ... –

Répondre

6

Les time objets ont pas de date, donc, par exemple, le 12:00 peut-être (par exemple) sur une mer et l'11:00 sur le précédent mar, faisant la différence de 25 heures, pas un (tout multiple de 24 pourrait être ajouté ou soustrait). Si vous savez qu'ils sont effectivement à la même date, appliquez simplement une date arbitraire à chacun d'entre eux (en faisant deux objets datetime) et puis vous pourrez les soustraire. Par exemple:

import datetime 

def timediff(t1, t2): 
    td = datetime.date.today() 
    return datetime.datetime.combine(td, t1) - datetime.datetime.combine(td, t2) 
+0

oui, c'est un truc ... mais je continue à comprendre pourquoi

__sub__
n'est pas implémenté: c'est évident que les deux fois se réfèrent au même jour, sinon j'aurais dû utiliser datetime.datetime. Par exemple, le logiciel de feuille de données fait ceci (excel) –

+1

Peut-être évident pour vous, mais pas pour tout le monde. Il est plus facile de ne pas le supporter maintenant, de le supporter dans le futur, et de ne pas avoir à vivre avec un possible mauvais choix maintenant. –

+0

Cela est en quelque sorte lié à la façon dont vous ne pouvez pas modifier un objet datetime.time() avec un objet datetime.timedelta(). Comme le dit Alex, ne pas avoir de composant de date signifie que vous ne savez pas s'ils sont dans la même journée. De même, si vous ajoutez/soustrayez un timedelta, il peut pousser l'heure sur un autre jour (overflow), et il n'y a aucun moyen de le savoir. –

0

Vous pouvez obtenir le résultat souhaité par

t1 = time(12, 0) 
t2 = time(11, 0) 
td = timedelta(hours=t1.hour-t2.hour, minutes=t1.minute-t2.minute) 
+0

ok, bien sûr, mais je veux comprendre pourquoi la méthode __sub__ n'est pas implémentée –