2009-10-01 19 views

Respuesta

133

datetime.date.today() + datetime.timedelta(days=1) debe hacer el truco

30

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 le preguntó en un comentario, saltar días no suponen 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) 
+0

Maneja bien los años bisiestos? – Rook

+0

@ldigas: sí lo hace. – nosklo

5

Sin manipulación de leap seconds Tho:

>>> 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 - @ Marcos: 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) 

Me gustaría pensar que gmtime o localtime tomarían el valor devuelto por mktime y me ha dado respalda la tupla original, con 60 como la cantidad de segundos. Y esta prueba muestra que estos segundos intercalares simplemente 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 
+0

'time.strftime' maneja segundos intercalares: vea la Nota 2: http://docs.python.org/library/time.html#time.strftime y Note 3: http://docs.python.org/library/datetime .html # strftime-behavior –

+0

Esto se debe a que el tiempo de Unix no maneja los segundos intercalares. Ver http://en.wikipedia.org/wiki/Unix_time#History, http://www.mail-archive.com/[email protected]/msg00094.html, y POSIX en sí. –

+0

"todos los días se contabilizarán exactamente 86400 segundos" http://www.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_15 –

4

Incluso el módulo básico time puede manejar esto:

import time 
time.localtime(time.time() + 24*3600) 
+0

La solución más elegante de todas – Greg

+0

Esto falla en los límites del horario de verano en los Estados Unidos, porque en esos límites un día tendrá 23 horas y un día tendrá 25 horas. Esto tampoco toma varios segundos en cuenta. –

+0

@CharlesWood: esta respuesta puede devolver una hora diferente que (en algunas zonas horarias) significa que puede devolver una ** fecha diferente ** (no mañana) pero siempre devuelve el tiempo exactamente 24 horas antes (la respuesta aceptada regresa a la medianoche (horas desconocidas a partir de ahora)). No veo cómo los segundos intercalares pueden cambiar el resultado aquí a menos que se los llame durante un segundo intercalar en sistemas en los que 23:59:60 y 00:00:00 tienen la misma marca de tiempo. – jfs

Cuestiones relacionadas