¿Cuál es la forma más limpia y pitónica de conseguir la cita de mañana? Debe haber una mejor manera que agregar uno al día, manejar los días al final del mes, etc.
¿Cuál es la forma más limpia y pitónica de conseguir la cita de mañana? Debe haber una mejor manera que agregar uno al día, manejar los días al final del mes, etc.
Respuestas:
datetime.date.today() + datetime.timedelta(days=1)
debería hacer el truco
timedelta
puede manejar la adición de días, segundos, microsegundos, milisegundos, minutos, horas o semanas.
>>> import datetime
>>> today = datetime.date.today()
>>> today
datetime.date(2009, 10, 1)
>>> today + datetime.timedelta(days=1)
datetime.date(2009, 10, 2)
>>> datetime.date(2009,10,31) + datetime.timedelta(hours=24)
datetime.date(2009, 11, 1)
Como se preguntó en un comentario, los días bisiestos no representan ningún problema:
>>> datetime.date(2004, 2, 28) + datetime.timedelta(days=1)
datetime.date(2004, 2, 29)
>>> datetime.date(2004, 2, 28) + datetime.timedelta(days=2)
datetime.date(2004, 3, 1)
>>> datetime.date(2005, 2, 28) + datetime.timedelta(days=1)
datetime.date(2005, 3, 1)
Sin manejo de segundos intercalares aunque:
>>> from datetime import datetime, timedelta
>>> dt = datetime(2008,12,31,23,59,59)
>>> str(dt)
'2008-12-31 23:59:59'
>>> # leap second was added at the end of 2008,
>>> # adding one second should create a datetime
>>> # of '2008-12-31 23:59:60'
>>> str(dt+timedelta(0,1))
'2009-01-01 00:00:00'
>>> str(dt+timedelta(0,2))
'2009-01-01 00:00:01'
maldito.
EDITAR - @Mark: Los documentos dicen "sí", pero el código dice "no tanto":
>>> time.strptime("2008-12-31 23:59:60","%Y-%m-%d %H:%M:%S")
(2008, 12, 31, 23, 59, 60, 2, 366, -1)
>>> time.mktime(time.strptime("2008-12-31 23:59:60","%Y-%m-%d %H:%M:%S"))
1230789600.0
>>> time.gmtime(time.mktime(time.strptime("2008-12-31 23:59:60","%Y-%m-%d %H:%M:%S")))
(2009, 1, 1, 6, 0, 0, 3, 1, 0)
>>> time.localtime(time.mktime(time.strptime("2008-12-31 23:59:60","%Y-%m-%d %H:%M:%S")))
(2009, 1, 1, 0, 0, 0, 3, 1, 0)
Pensaría que gmtime o localtime tomarían el valor devuelto por mktime y me devolverían la tupla original, con 60 como el número de segundos. Y esta prueba muestra que estos segundos intercalares pueden desaparecer ...
>>> a = time.mktime(time.strptime("2008-12-31 23:59:60","%Y-%m-%d %H:%M:%S"))
>>> b = time.mktime(time.strptime("2009-01-01 00:00:00","%Y-%m-%d %H:%M:%S"))
>>> a,b
(1230789600.0, 1230789600.0)
>>> b-a
0.0
Incluso el time
módulo básico puede manejar esto:
import time
time.localtime(time.time() + 24*3600)
time.strftime
maneja los segundos intercalares : consulte la Nota 2: docs.python.org/library/time.html#time.strftime y la Nota 3: docs.python.org/library/datetime.html#strftime-behavior