Dado un datetime.time
valor en Python, ¿hay una forma estándar de agregarle un número entero de segundos, de modo que 11:34:59
+ 3 = 11:35:02
, por ejemplo?
Estas ideas obvias no funcionan:
>>> 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'
Al final he escrito funciones como esta:
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)
Sin embargo, no puedo evitar pensar que me falta una forma más fácil de hacer esto.
Respuestas:
Puede usar
datetime
variables completas contimedelta
, y al proporcionar una fecha ficticia y luego usartime
para obtener el valor de tiempo.Por ejemplo:
da como resultado los dos valores, separados por tres segundos:
También puedes optar por los más legibles
si eres tan inclinado
Si está buscando una función que pueda hacer esto, puede buscar el uso a
addSecs
continuación:Esto produce:
fuente
Como han dicho otros aquí, puede usar objetos de fecha y hora completos en todo:
Sin embargo, creo que vale la pena explicar por qué se requieren objetos de fecha y hora completos. Considere lo que sucedería si agregara 2 horas a las 11 p.m. ¿Cuál es el comportamiento correcto? ¿Una excepción, porque no puede tener un tiempo mayor a las 11:59 pm? ¿Debería envolverse de nuevo?
Los diferentes programadores esperarán cosas diferentes, por lo que cualquier resultado que elijan sorprendería a mucha gente. Peor aún, los programadores escribirían código que funcionó bien cuando lo probaron inicialmente, y luego lo romperían más tarde haciendo algo inesperado. Esto es muy malo, por lo que no puede agregar objetos timedelta a objetos de tiempo.
fuente
Una pequeña cosa, podría agregar claridad para anular el valor predeterminado por segundos
fuente
Gracias a @Pax Diablo, @bvmou y @Arachnid por la sugerencia de usar fechas completas en todo momento. Si tengo que aceptar objetos datetime.time de una fuente externa, entonces esta parece ser una
add_secs_to_time()
función alternativa :Este código detallado se puede comprimir en esta línea:
pero creo que de todos modos me gustaría resumirlo en una función para la claridad del código.
fuente
Si vale la pena agregar otro archivo / dependencia a su proyecto, acabo de escribir una pequeña clase que se extiende
datetime.time
con la capacidad de hacer aritmética. Cuando pasas la medianoche, se ajusta a cero. Ahora, "¿Qué hora será, dentro de 24 horas?" Tiene muchos casos de esquina, incluido el horario de verano, los segundos bisiestos, los cambios históricos de la zona horaria, etc. Pero a veces realmente necesitas el caso simple, y eso es lo que hará.Su ejemplo se escribiría:
nptime
hereda dedatetime.time
, por lo que cualquiera de esos métodos también debería ser utilizable.Está disponible en PyPi como
nptime
("tiempo no pedante"), o en GitHub: https://github.com/tgs/nptimefuente
No puede simplemente agregar un número
datetime
porque no está claro qué unidad se utiliza: segundos, horas, semanas ...Hay
timedelta
clase para manipulaciones con fecha y hora.datetime
menosdatetime
datimedelta
,datetime
mástimedelta
dadatetime
, dosdatetime
objetos no se pueden agregar aunque dostimedelta
sí.Cree un
timedelta
objeto con la cantidad de segundos que desea agregar y agréguelo aldatetime
objeto:Hay mismo concepto en C ++:
std::chrono::duration
.fuente
Para completar, esta es la forma de hacerlo
arrow
(mejores fechas y horarios para Python):fuente
Intenta agregar
datetime.datetime
a adatetime.timedelta
. Si solo desea la porción de tiempo, puede llamar altime()
método en eldatetime.datetime
objeto resultante para obtenerlo.fuente
Antigua pregunta, pero pensé que incluiría una función que maneje zonas horarias. Las partes clave pasan el atributo
datetime.time
del objetotzinfo
a combinar y luego se usan entimetz()
lugar detime()
en la fecha y hora ficticia resultante. Esta respuesta en parte inspirada por las otras respuestas aquí.Y aquí hay una clase de caso de prueba realmente simple (usando incorporado
unittest
):fuente