Étant donné une datetime.time
valeur en Python, existe-t-il un moyen standard d'y 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'
Au final, j'ai écrit 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 que je manque un moyen plus facile de le faire.
Réponses:
Vous pouvez utiliser des
datetime
variables complètes avectimedelta
et en fournissant une date fictive, puis en utilisanttime
simplement pour obtenir la valeur de l'heure.Par exemple:
donne les deux valeurs, à trois secondes d'intervalle:
Vous pouvez également opter pour le plus lisible
si vous êtes si enclin.
Si vous recherchez une fonction qui peut le faire, vous pouvez examiner l'utilisation
addSecs
ci-dessous:Cela produit:
la source
Comme d'autres l'ont indiqué ici, vous pouvez simplement utiliser des objets datetime complets tout au long:
Cependant, je pense qu'il vaut la peine d'expliquer pourquoi des objets datetime complets sont requis. Considérez ce qui se passerait si j'ajoutais 2 heures à 23 heures. Quel est le bon comportement? Une exception, car vous ne pouvez pas avoir une heure supérieure à 23h59? Doit-il s'enrouler autour?
Différents programmeurs s'attendent à des choses différentes, donc quel que soit le résultat choisi, il surprendra beaucoup de gens. Pire encore, les programmeurs écriraient du code qui fonctionnait très bien lorsqu'ils le testaient initialement, puis le cassaient plus tard en faisant quelque chose d'inattendu. C'est très mauvais, c'est pourquoi vous n'êtes pas autorisé à ajouter des objets timedelta aux objets temporels.
la source
Une petite chose, pourrait ajouter de la clarté pour remplacer la valeur par défaut pendant quelques secondes
la source
Merci à @Pax Diablo, @bvmou et @Arachnid pour la suggestion d'utiliser des heures de données complètes tout au long. Si je dois accepter des objets datetime.time d'une source externe, cela semble être une
add_secs_to_time()
fonction alternative :Ce code prolixe peut être compressé dans ce one-liner:
mais je pense que je voudrais quand même envelopper dans une fonction pour la clarté du code.
la source
Si cela vaut la peine d'ajouter un autre fichier / dépendance à votre projet, je viens d'écrire une toute petite classe qui s'étend
datetime.time
avec la possibilité de faire de l'arithmétique. Lorsque vous dépassez minuit, il s'enroule autour de zéro. Désormais, «Quelle heure sera-t-il dans 24 heures?» Contient de nombreux cas d'angle, y compris l'heure d'été, les secondes intercalaires, les changements de fuseau horaire historiques, etc. Mais parfois, vous avez vraiment besoin du boîtier simple, et c'est ce que cela fera.Votre exemple serait écrit:
nptime
hérite dedatetime.time
, donc toutes ces méthodes devraient également être utilisables.Il est disponible sur PyPi en tant que
nptime
("temps non pédant"), ou sur GitHub: https://github.com/tgs/nptimela source
Vous ne pouvez pas simplement ajouter un nombre
datetime
car il n'est pas clair à quelle unité est utilisée: secondes, heures, semaines ...Il y a une
timedelta
classe pour les manipulations avec la date et l'heure.datetime
moinsdatetime
donnetimedelta
,datetime
plustimedelta
donnedatetime
, deuxdatetime
objets ne peuvent pas être ajoutés bien que deux letimedelta
puissent.Créez un
timedelta
objet avec combien de secondes vous voulez ajouter et ajoutez-le à l'datetime
objet:Il y a même concept en C ++:
std::chrono::duration
.la source
Par souci d'exhaustivité, voici la façon de le faire avec
arrow
(meilleures dates et heures pour Python):la source
Essayez d'ajouter un
datetime.datetime
à undatetime.timedelta
. Si vous ne voulez que la portion de temps, vous pouvez appeler latime()
méthode sur l'datetime.datetime
objet résultant pour l'obtenir.la source
Vieille question, mais je pensais que je mettrais dans une fonction qui gère les fuseaux horaires. Les éléments clés passent l' attribut de l'
datetime.time
objettzinfo
dans la moissonneuse-batteuse, puis les utilisent à latimetz()
place detime()
la date / heure fictive résultante. Cette réponse s'inspire en partie des autres réponses ici.Et voici une classe de cas de test vraiment simple (en utilisant intégrée
unittest
):la source