Python time + timedelta equivalente

Respuestas:

138

La solución está en el enlace que proporcionó en su pregunta:

datetime.combine(date.today(), time()) + timedelta(hours=1)

Ejemplo completo:

from datetime import date, datetime, time, timedelta

dt = datetime.combine(date.today(), time(23, 55)) + timedelta(minutes=30)
print dt.time()

Salida:

00:25:00
jfs
fuente
4
Se siente un poco como una solución para mejorar los datos con información irrelevante. ¿Qué sucede si today()es el día antes de cambiar al horario de verano y el timedelta se extiende a la zona horaria diferente? ¿Este código se ve afectado por las configuraciones regionales?
bluenote10
1
@ bluenote10 un objeto de fecha y hora ingenuo es solo un número entero de microsegundos que se desglosa de acuerdo con el calendario gregoriano proléptico. En otras palabras, el código en la respuesta funciona igual, durante las transiciones de DST en cualquier zona horaria local. date.today()se utiliza para admitir timedeltas tanto positivos como negativos. date.minfuncionaría para timedeltas positivos.
jfs
@JFSebastian: Eso es reconfortante, gracias por la actualización. Todavía me da vergüenza si una función que se supone que es pura tiene un efecto secundario. A la gente del año 9999 tampoco le gustará esto;).
bluenote10
3
@ bluenote10 La practicidad vence a la pureza. Dudo datetime.MAXYEARque siga siendo 9999 en 9999.
jfs
10

Si vale la pena agregar otro archivo / dependencia a su proyecto, acabo de escribir una pequeña clase que se extiende datetime.timecon la capacidad de hacer aritmética. Si pasa de la medianoche, simplemente termina:

>>> from nptime import nptime
>>> from datetime import timedelta
>>> afternoon = nptime(12, 24) + timedelta(days=1, minutes=36)
>>> afternoon
nptime(13, 0)
>>> str(afternoon)
'13:00:00'

Está disponible en PyPi como nptime ("tiempo no pedante") o en GitHub: https://github.com/tgs/nptime

La documentación está en http://tgs.github.io/nptime/

rescdsk
fuente
Excelente. Esto ahorra el viaje de ida y vuelta al mundo de la fecha y hora y viceversa.
Joshua Chia
6

Esto es un poco desagradable, pero:

from datetime import datetime, timedelta

now = datetime.now().time()
# Just use January the first, 2000
d1 = datetime(2000, 1, 1, now.hour, now.minute, now.second)
d2 = d1 + timedelta(hours=1, minutes=23)
print d2.time()
Ali Afshar
fuente
1
+1: para datetimemódulo. De lo contrario, sería necesario tratar los errores de desbordamiento y demás manualmente.
jfs
6

Solución alterna:

t = time()
t2 = time(t.hour+1, t.minute, t.second, t.microsecond)

También puede omitir los microsegundos, si no necesita tanta precisión.

algo
fuente
sí, buena respuesta. Debería haberlo hecho más complicado, como: time () + timedelta (minutos = 30)
Antonius Common
6
Si t == time(23,59)entonces este enfoque no funcionará. Cuando se agrega 1a t.hourque obtendráValueError: hour must be in 0..23
JFS
Corregido el error de sintaxis. Para el caso de las 23:59, la pregunta es cuál es la verdadera intención del cálculo, qué es lo que realmente desea obtener como resultado en ese caso. Supuse que debe permanecer en el mismo día (o dar un error), de lo que normalmente tendría fecha y hora en el primer lugar ...
algo
1
Este método me causó un error porque estaba agregando 1 día al 31 de octubre. Es por esta razón que debe usar datetime.timedelta(days=1)para agregar un día a un objeto de fecha y hora. Evitarás la tierra de depuración.
Bobort
2

Puede cambiar la hora () a ahora () para que funcione

from datetime import datetime, timedelta
datetime.now() + timedelta(hours=1)
yiming
fuente