A maneira mais limpa e pitônica de obter a data de amanhã?


120

Qual é a maneira mais limpa e pitônica de obter a data de amanhã? Deve haver uma maneira melhor do que adicionar um ao dia, lidar com os dias no final do mês, etc.

Respostas:


241

datetime.date.today() + datetime.timedelta(days=1) deve fazer o truque


39

timedelta pode lidar com a adição de dias, segundos, microssegundos, milissegundos, minutos, horas ou 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)

Conforme solicitado em um comentário, os dias bissextos não representam 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)

7

Sem manipulação de segundos bissextos para :

>>> 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: Os documentos dizem "sim", mas o código diz "nem 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)

Eu pensaria que gmtime ou localtime pegaria o valor retornado por mktime e me devolveria a tupla original, com 60 como o número de segundos. E este teste mostra que esses segundos bissextos podem simplesmente 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


Isso ocorre porque o tempo Unix não controla os segundos bissextos. Consulte en.wikipedia.org/wiki/Unix_time#History , mail-archive.com/leapsecs@rom.usno.navy.mil/msg00094.html e o próprio POSIX.

"cada dia deve ser contabilizado por exatamente 86400 segundos" opengroup.org/onlinepubs/9699919799/basedefs/…

Os anos bissextos são responsáveis ​​pela diferença entre o ano solar e até 365 dias, enquanto os segundos bissextos são inerentemente diferentes e são responsáveis ​​pelas diferenças causadas por fatores externos como terremotos. Isso os torna irregulares e não pode ser determinado da mesma forma que, por exemplo, determinar o dia da semana em que será lançado 3 de março de 2055.
David Woods

1
@DavidWoods: segundos bissextos são para manter o UTC dentro de +/- 0,9 segundos de UT1 (rotação da Terra). Há 25 segundos bissextos acumulados de 1972 a 2012. Terremotos são muito fracos para causá-los ( um único terremoto pode introduzir mudanças de microssegundos - mil vezes menos do que uma diferença típica de milissegundos na duração do dia de 86400 segundos SI ).
jfs

5

Até mesmo o timemódulo básico pode lidar com isso:

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

1
Isso falha nos limites do horário de verão nos Estados Unidos, porque nesses limites um dia terá 23 horas e o outro dia terá 25 horas. Isso também não leva em consideração os segundos bissextos.
Charles Wood de

@CharlesWood: esta resposta pode retornar uma hora diferente que (em alguns fusos horários) significa que pode retornar uma data diferente (não amanhã), mas sempre retorna a hora que está exatamente 24 horas à frente (a resposta aceita retorna meia-noite (horas desconhecidas a partir de agora )). Não vejo como os segundos bissextos podem alterar o resultado aqui, a menos que sejam chamados durante um segundo bissexto em sistemas onde 23:59:60 e 00:00:00 têm o mesmo carimbo de data / hora.
jfs

É verdade que sempre será 24 horas a partir de agora, mas essa não era a questão. OP queria saber como chegar ao encontro de amanhã . Os segundos bissextos foram apenas picuinhas;)
Charles Wood

@CharlesWood: sim. Acabei de esclarecer que não retorna 23, 25 horas. E sim, pode retornar uma data errada (não amanhã, por exemplo, para "2014-10-18 23:00:00" no fuso horário "Brasil / Leste"). Relacionado: dada a hora atual em UTC, como você determina a hora de início e de término do dia em um fuso horário específico? .
jfs

@JFSebastian Certo, eu só estava tentando apontar que os dias nem sempre têm 24 horas . Não admira que trabalhar com datas seja tão difícil; é difícil até mesmo se comunicar sobre eles: /
Charles Wood
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.