What is the cleanest and most Pythonic way to get tomorrow's date? There must be a better way than to add one to the day, handle days at the end of the month, etc.
+13
A:
datetime.date.today() + datetime.timedelta(days=1)
should do the trick
Kamil Szot
2009-10-01 22:49:11
+8
A:
timedelta
can handle adding days, seconds, microseconds, milliseconds, minutes, hours, or weeks.
>>> 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)
As asked in a comment, leap days pose no 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
2009-10-01 22:49:24
It handles leap years ok ?
ldigas
2009-10-01 23:01:19
@ldigas: yes it does.
nosklo
2009-10-02 10:31:34
+1
A:
No handling of 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'
darn.
EDIT - @Mark: The docs say "yes", but the code says "not so much":
>>> 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)
I would think that gmtime or localtime would take the value returned by mktime and given me back the original tuple, with 60 as the number of seconds. And this test shows that these leap seconds can just fade away...
>>> 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
Paul McGuire
2009-10-01 23:45:34
`time.strftime` handles leap seconds: see Note 2: http://docs.python.org/library/time.html#time.strftime and Note 3: http://docs.python.org/library/datetime.html#strftime-behavior
Mark Rushakoff
2009-10-02 00:18:22
This is because Unix time doesn't handle leap seconds. See http://en.wikipedia.org/wiki/Unix_time#History, http://www.mail-archive.com/[email protected]/msg00094.html, and POSIX itself.
Roger Pate
2009-11-29 23:37:31
"each and every day shall be accounted for by exactly 86400 seconds" http://www.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_15
Roger Pate
2009-11-29 23:42:08
A:
Even the basic time
module can handle this:
import time
time.localtime(time.time() + 24*3600)
kaizer.se
2009-10-01 23:58:15