2009-10-01 27 views

回答

133

datetime.date.today() + datetime.timedelta(days=1)应该做的伎俩

30

timedelta可以处理增加天,秒,微秒,毫秒,几分钟,几小时或几周。

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

如问一个评论,飞跃天不成问题:

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

它处理闰年好吗? – Rook 2009-10-01 23:01:19

+0

@ldigas:是的。 – nosklo 2009-10-02 10:31:34

5

leap seconds寿无处理:

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

织补。

编辑 - @马克:文档说“是”,但代码说“没有那么多”:

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

我认为gmtime的或本地时间将采取由mktime返回,给我的价值返回原始元组,其中60为秒数。而这个测试表明,这些闰秒可慢慢消失......

>>> 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'处理闰秒:请参阅注2:http://docs.python.org/library/time.html#time.strftime和注3:http://docs.python.org/library/datetime .html#strftime-behavior – 2009-10-02 00:18:22

+0

这是因为Unix时间不处理闰秒。请参阅http://en.wikipedia.org/wiki/Unix_time#History,http://www.mail-archive.com/[email protected]/msg00094.html和POSIX本身。 – 2009-11-29 23:37:31

+0

“每一天都应该被准确的计算86400秒”http://www.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_15 – 2009-11-29 23:42:08

4

连基本的time模块可以处理这个问题:

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

最优雅的解决方案 – Greg 2013-02-01 20:16:16

+0

这在美国夏令时的边界上失败了,因为在这些边界上,一天会有23个小时,一天会有25个小时。这也不会考虑闰秒。 – 2014-08-14 23:12:29

+0

@CharlesWood:这个答案可能会返回一个不同的小时(在某些时区),这意味着它可能会返回一个**不同的日期**(不是明天),但它总是返回提前24小时的时间(接受的答案会在午夜返回(从现在起未知小时))。我没有看到闰秒如何在这里改变结果,除非在23:59:60和00:00:00具有相同时间戳的系统上的闰秒调用。 – jfs 2014-09-04 21:46:34

相关问题