2009-10-01 54 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

相關問題