Question

Étant donné la valeur datetime.time dans Python, existe-t-il un moyen standard d’ajouter un nombre entier de secondes, de sorte que 11:34:59 + 3 = 11:35:02 , par exemple?

Ces idées évidentes ne fonctionnent pas:

>>> datetime.time(11, 34, 59) + 3
TypeError: unsupported operand type(s) for +: 'datetime.time' and 'int'
>>> datetime.time(11, 34, 59) + datetime.timedelta(0, 3)
TypeError: unsupported operand type(s) for +: 'datetime.time' and 'datetime.timedelta'
>>> datetime.time(11, 34, 59) + datetime.time(0, 0, 3)
TypeError: unsupported operand type(s) for +: 'datetime.time' and 'datetime.time'

J'ai fini par écrire des fonctions comme celle-ci:

def add_secs_to_time(timeval, secs_to_add):
    secs = timeval.hour * 3600 + timeval.minute * 60 + timeval.second
    secs += secs_to_add
    return datetime.time(secs // 3600, (secs % 3600) // 60, secs % 60)

Je ne peux pas m'empêcher de penser qu'il me manque un moyen plus facile de le faire.

Connexes

Était-ce utile?

La solution

Vous pouvez utiliser des variables datetime complètes avec timedelta , en fournissant une date fictive puis en utilisant time pour obtenir simplement la valeur temporelle. / p>

Par exemple:

import datetime
a = datetime.datetime(100,1,1,11,34,59)
b = a + datetime.timedelta(0,3) # days, seconds, then other fields.
print a.time()
print b.time()

donne les deux valeurs, à trois secondes d'intervalle:

11:34:59
11:35:02

Vous pouvez également opter pour le plus lisible

b = a + datetime.timedelta(seconds=3)

si vous êtes si enclin.

Si vous recherchez une fonction capable de le faire, vous pouvez utiliser addSecs ci-dessous:

import datetime

def addSecs(tm, secs):
    fulldate = datetime.datetime(100, 1, 1, tm.hour, tm.minute, tm.second)
    fulldate = fulldate + datetime.timedelta(seconds=secs)
    return fulldate.time()

a = datetime.datetime.now().time()
b = addSecs(a, 300)
print a
print b

Cette sortie:

 09:11:55.775695
 09:16:55

Autres conseils

Comme d'autres l'ont déjà indiqué, vous pouvez simplement utiliser des objets datetime complets:

sometime = get_some_time() # the time to which you want to add 3 seconds
later = (datetime.combine(date.today(), sometime) + timedelta(seconds=3)).time()

Cependant, je pense qu'il est utile d'expliquer pourquoi des objets datetime complets sont requis. Considérez ce qui arriverait si j'ajoutais 2 heures à 23 heures. Quel est le comportement correct? Une exception, parce que vous ne pouvez pas avoir une heure supérieure à 23h59? Devrait-il revenir en arrière?

Différents programmeurs s’attendent à des choses différentes, alors quel que soit le résultat choisi, cela surprendrait beaucoup de monde. Pire encore, les programmeurs écrivaient du code qui fonctionnait parfaitement lorsqu’ils l’avaient initialement testé, puis le cassaient plus tard en faisant quelque chose d’inattendu. C’est très grave, c’est pourquoi vous n'êtes pas autorisé à ajouter des objets timedelta aux objets temporels.

Une petite chose pourrait ajouter de la clarté pour remplacer la valeur par défaut en secondes

>>> b = a + datetime.timedelta(seconds=3000)
>>> b
datetime.datetime(1, 1, 1, 12, 24, 59)

Merci à @Pax Diablo, @bvmou et @Arachnid pour leur suggestion d'utiliser des dates / heures complètes. Si je dois accepter des objets datetime.time d'une source externe, cela semble être une autre fonction add_secs_to_time () :

def add_secs_to_time(timeval, secs_to_add):
    dummy_date = datetime.date(1, 1, 1)
    full_datetime = datetime.datetime.combine(dummy_date, timeval)
    added_datetime = full_datetime + datetime.timedelta(seconds=secs_to_add)
    return added_datetime.time()

Ce code détaillé peut être compressé dans cette ligne:

(datetime.datetime.combine(datetime.date(1, 1, 1), timeval) + datetime.timedelta(seconds=secs_to_add)).time()

mais je pense que je voudrais envelopper dans une fonction pour la clarté du code de toute façon.

S'il vaut la peine d'ajouter un autre fichier / dépendance à votre projet, je viens d'écrire une toute petite classe qui étend datetime.time avec la possibilité de faire de l'arithmétique. Quand on dépasse minuit, il tourne à zéro. Maintenant, "Quelle heure sera-t-il, dans 24 heures" a de nombreux cas, y compris l'heure avancée, les secondes intercalaires, les changements d'historique de fuseau horaire, etc. Mais parfois, vous avez vraiment besoin du cas simple, et c'est ce que cela va faire.

Votre exemple s’écrirait:

>>> import datetime
>>> import nptime
>>> nptime.nptime(11, 34, 59) + datetime.timedelta(0, 3)
nptime(11, 35, 2)

nptime hérite de datetime.time , aucune de ces méthodes ne doit donc être utilisable.

Il est disponible auprès de PyPi sous la forme nptime ("heure non pédantique") ou sur GitHub: https://github.com/tgs/nptime

Vous ne pouvez pas simplement ajouter un numéro à datetime car il est difficile de savoir quelle unité est utilisée: secondes, heures, semaines ...

Il existe une classe timedelta pour les manipulations avec la date et l'heure. datetime moins datetime donne timedelta , datetime plus timedelta donne datetime , deux objets datetime ne peuvent pas être ajoutés bien que deux timedelta puissent l'être.

Créez un objet timedelta avec le nombre de secondes que vous souhaitez ajouter et ajoutez-le à l'objet datetime :

>>> from datetime import datetime, timedelta
>>> t = datetime.now() + timedelta(seconds=3000)
>>> print(t)
datetime.datetime(2018, 1, 17, 21, 47, 13, 90244)

Il existe le même concept en C ++: std :: chrono :: duration .

Par souci d'exhaustivité, voici comment procéder avec flèche (meilleures dates et heures pour Python):

sometime = arrow.now()
abitlater = sometime.shift(seconds=3)

Essayez d’ajouter un datetime.datetime à un datetime.timedelta . Si vous souhaitez uniquement la partie heure, vous pouvez appeler la méthode time () sur l'objet résultant datetime.datetime pour l'obtenir.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top