2009-10-01 3 views

Antwort

133

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

30

timedelta Griff tun kann Tage, Sekunden, Mikrosekunden, Millisekunden das Hinzufügen, Minuten, Stunden oder Wochen.

>>> 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, Pose Sprung Tage 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) 
+0

Es behandelt Schaltjahre ok? – Rook

+0

@ldigas: ja, tut es. – nosklo

5

Keine Handhabung von 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' 

stopfen.

EDIT - @ Mark: Die docs „ja“ sagen, 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 Lokalzeit den Wert von mktime und gab mir zurücknehmen würde Zurück das ursprüngliche Tupel, mit 60 als die Anzahl der Sekunden. Und dieser Test zeigt, dass diese Schaltsekunden einfach weg verblassen ...

>>> 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' behandelt Schaltsekunden: siehe Hinweis 2: http://docs.python.org/library/time.html#time.strftime und Hinweis 3: http://docs.python.org/library/datetime .html # strftime-behavior –

+0

Dies liegt daran, dass die Unix-Zeit keine Schaltsekunden behandelt. Siehe http://en.wikipedia.org/wiki/Unix_time#History, http://www.mail-archive.com/[email protected]/msg00094.html und POSIX selbst. –

+0

"jeden Tag wird genau 86400 Sekunden entfallen" http://www.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_15 –

4

Schon die Basis time Modul kann damit umgehen:

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

Die eleganteste Lösung aus allen – Greg

+0

Dies scheitert an den Grenzen der Sommerzeit in den Vereinigten Staaten, weil an diesen Grenzen ein Tag 23 Stunden und ein Tag 25 Stunden haben wird. Dies berücksichtigt auch keine Schaltsekunden. –

+0

@CharlesWood: Diese Antwort kann eine andere Stunde zurückgeben, die (in einigen Zeitzonen) ein ** anderes Datum ** (nicht morgen) zurückgibt, aber es gibt immer die Zeit zurück, die genau 24 Stunden voraus ist (die angenommene Antwort gibt Mitternacht zurück (unbekannte Stunden von jetzt)). Ich sehe nicht, wie Schaltsekunden das Ergebnis hier ändern können, wenn sie nicht während einer Schaltsekunde auf Systemen aufgerufen werden, bei denen 23:59:60 und 00:00:00 den gleichen Zeitstempel haben. – jfs

Verwandte Themen