Was ist der sauberste und pythonischste Weg, um das morgige Date zu bekommen? Es muss einen besseren Weg geben, als einen zum Tag hinzuzufügen, Tage am Monatsende zu behandeln usw.
Was ist der sauberste und pythonischste Weg, um das morgige Date zu bekommen? Es muss einen besseren Weg geben, als einen zum Tag hinzuzufügen, Tage am Monatsende zu behandeln usw.
Antworten:
datetime.date.today() + datetime.timedelta(days=1)
sollte den Trick machen
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)
Keine Handhabung von Schaltsekunden 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'
verflixt.
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 der Sekunden zurückgeben würden. 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
Sogar das Basismodul time
kann damit umgehen:
import time
time.localtime(time.time() + 24*3600)
time.strftime
behandelt Schaltsekunden : siehe Anmerkung 2: docs.python.org/library/time.html#time.strftime und Anmerkung 3: docs.python.org/library/datetime.html#strftime-behavior