Der sauberste und pythonischste Weg, um das morgige Date zu bekommen?

120

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.

linkmaster03
quelle

Antworten:

241

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

Kamil Szot
quelle
39

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)
Mark Rushakoff
quelle
7

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
PaulMcG
quelle
time.strftimebehandelt Schaltsekunden : siehe Anmerkung 2: docs.python.org/library/time.html#time.strftime und Anmerkung 3: docs.python.org/library/datetime.html#strftime-behavior
Mark Rushakoff
Dies liegt daran, dass die Unix-Zeit keine Schaltsekunden verarbeitet. Siehe en.wikipedia.org/wiki/Unix_time#History , mail-archive.com/[email protected]/msg00094.html und POSIX selbst.
"Jeder Tag wird mit genau 86400 Sekunden berücksichtigt
Schaltjahre machen den Unterschied zwischen dem Sonnenjahr und sogar 365 Tagen aus, während Schaltsekunden von Natur aus unterschiedlich sind und Unterschiede berücksichtigen, die durch externe Faktoren wie Erdbeben verursacht werden. Dies macht sie unregelmäßig und kann nicht auf die gleiche Weise bestimmt werden, wie beispielsweise die Bestimmung des Wochentags, an dem der 3. März 2055 landen wird.
David Woods
1
@DavidWoods: Schaltsekunden sollen UTC innerhalb von +/- 0,9 Sekunden von UT1 (Erdrotation) halten. Von 1972 bis 2012 haben sich 25 Schaltsekunden angesammelt. Erdbeben sind zu schwach, um sie zu verursachen ( ein einzelnes Erdbeben kann Mikrosekundenänderungen hervorrufen - tausendmal weniger als ein typischer Millisekundenunterschied in der Tagesdauer von 86400 SI-Sekunden ).
JFS
5

Sogar das Basismodul timekann damit umgehen:

import time
time.localtime(time.time() + 24*3600)
u0b34a0f6ae
quelle
1
Dies schlägt an den Grenzen der Sommerzeit in den Vereinigten Staaten fehl, da an diesen Grenzen ein Tag 23 Stunden und ein Tag 25 Stunden hat. Dies berücksichtigt auch keine Schaltsekunden.
Charles Wood
@CharlesWood: Diese Antwort gibt möglicherweise eine andere Stunde zurück, was (in einigen Zeitzonen) bedeutet, dass möglicherweise ein anderes Datum (nicht morgen) zurückgegeben wird, aber immer die Zeit, die genau 24 Stunden im Voraus liegt (die akzeptierte Antwort gibt Mitternacht zurück (unbekannte Stunden ab jetzt) )). Ich sehe nicht, wie Schaltsekunden das Ergebnis hier ändern können, es sei denn, sie werden während einer Schaltsekunde auf Systemen aufgerufen, auf denen 23:59:60 und 00:00:00 denselben Zeitstempel haben.
JFS
Es wird zwar immer 24 Stunden dauern, aber das war nicht die Frage. OP wollte wissen, wie man das morgige Date bekommt . Die Sache mit den Schaltsekunden war nur ein Trottel;)
Charles Wood
@ CharlesWood: Ja. Ich habe gerade klargestellt, dass es nicht 23, 25 Stunden zurückgibt. Und ja, es kann ein falsches Datum zurückgegeben werden (nicht morgen, z. B. für "2014-10-18 23:00:00" in der Zeitzone "Brasilien / Ost"). Verwandte Themen: Wie bestimmen Sie angesichts der aktuellen Uhrzeit in UTC die Start- und Endzeit des Tages in einer bestimmten Zeitzone? .
JFS
@JFSebastian Richtig, ich wollte nur darauf hinweisen, dass Tage nicht immer 24 Stunden lang sind . Kein Wunder, dass die Arbeit mit Daten so schwierig ist. Es ist schwer, überhaupt über sie zu kommunizieren: /
Charles Wood