342 votes

Python - moyen facile d'ajouter N secondes à un datetime.time?

Étant donné un datetime.time de la valeur en Python, est-il un moyen standard pour ajouter un nombre entier de secondes, de telle sorte qu' 11:34:59 + 3 = 11:35:02, par exemple?

Ces idées évident 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'

En fin de compte, j'ai écrit des fonctions comme ceci:

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 que je suis absent un moyen plus facile de faire cela.

Liées

470voto

paxdiablo Points 341644

Vous pouvez utiliser à plein datetime variables timedelta, et en fournissant un mannequin date ensuite à l'aide d' time pour obtenir la valeur de temps.

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

résultats dans les deux valeurs, à trois secondes d'intervalle:

11:34:59
11:35:02

Vous pouvez également opter pour la plus lisible

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

si vous êtes si incliné.


Si vous êtes après une fonction qui permet de faire cela, vous pouvez regarder dans l'aide d' 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

Ce sorties:

 09:11:55.775695
 09:16:55

49voto

Eli Courtwright Points 53071

Comme d'autres ici ont dit, vous pouvez simplement utiliser la pleine datetime des objets de tout:

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 vaut la peine d'expliquer pourquoi une datetime les objets requis. Demander ce qui se passerait si j'ai ajouté 2 heures à 11 heures du soir. Quel est le comportement correct? Une exception, parce que vous ne pouvez pas avoir un temps supérieur à 11:59pm? Faut-il de retour envelopper autour?

Les différents programmeurs attendent des choses différentes, alors quel résultat, ils ont ramassé serait surpris beaucoup de gens. Pire encore, les programmeurs d'écrire le code qui a très bien fonctionné quand ils ont été testés d'abord, et puis de pause plus tard, en faisant quelque chose d'inattendu. C'est très mauvais, c'est pourquoi vous n'êtes pas autorisé à ajouter timedelta objets à la fois des objets.

20voto

unmounted Points 10968

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

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

11voto

Paul Stephenson Points 17507

Merci à @ Pax Diablo , @bvmou et @Arachnid pour la suggestion d'utiliser des datetime complètes tout au long. Si je dois accepter des objets datetime.time provenant 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 verbeux peut être compressé à ce one-liner:

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

8voto

rescdsk Points 4136

Si ça vaut la peine d'en ajouter un autre fichier / dépendance à votre projet, je viens d'écrire un petit peu de classe qui étend la classe datetime.time avec la capacité de faire de l'arithmétique. Quand vous allez au-delà de minuit, il s'enroule autour de zéro. Maintenant, "à Quelle heure sera-ce, 24 heures à partir de maintenant", a beaucoup de coin affaires, y compris l'heure d'été, les secondes intercalaires, l'historique des changements de fuseau horaire, et ainsi de suite. Mais parfois, il faut vraiment le cas simple, et c'est ce que cela va faire.

Votre exemple serait écrit:

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

nptime hérite datetime.time, de sorte que l'un quelconque de ces méthodes devrait être utilisable, trop.

Il est disponible sur PyPi comme nptime (ğ non-pédant temps"), ou sur GitHub: https://github.com/tgs/nptime

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X