Frage Der sauberste und pythonischste Weg, um das Date von morgen zu bekommen?


Was ist der sauberste und pythonischste Weg, um das Date von morgen zu bekommen? Es muss einen besseren Weg geben, als einen Tag hinzuzufügen, die Tage am Ende des Monats zu behandeln usw.


75
2017-10-01 22:45


Ursprung


Antworten:


datetime.date.today() + datetime.timedelta(days=1) sollte den Trick machen


150
2017-10-01 22:49



timedelta kann Tage, Sekunden, Mikrosekunden, Millisekunden, Minuten, Stunden oder Wochen hinzufügen.

>>> 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)

Wie in einem Kommentar gefragt, sind Schalttage kein Problem:

>>> 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)

30
2017-10-01 22:49



Keine Behandlung von Sekunden überspringen 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'

verdammt.

EDIT - @Mark: Die Dokumente sagen "Ja", aber der Code sagt "nicht so viel":

>>> 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)

Ich würde denken, dass gmtime oder localtime den von mktime zurückgegebenen Wert annehmen und mir das ursprüngliche Tupel mit 60 als Anzahl von Sekunden zurückgeben würde. Und dieser Test zeigt, dass diese Schaltsekunden einfach verblassen können ...

>>> 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

5
2017-10-01 23:45



Sogar das Grundlegende time Modul kann damit umgehen:

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

4
2017-10-01 23:58