3.1 計算昨天和明天的日期
感謝:Andrea Cavalcanti
任務
你想獲得今天的日期,并以此計算昨天和明天的日期。
解決方案
無論何時你遇到有關"時間變化"或者"時間差"的問題,先考慮timedelta:
- import datetime
- today = datetime.date.today( )
- yesterday = today - datetime.timedelta(days=1)
- tomorrow = today + datetime.timedelta(days=1)
- print yesterday, today, tomorrow
- #輸出:2004-11-17 2004-11-18 2004-11-19
讨論
自從datetime子產品出現以來,這個問題在Python郵件清單中頻頻露面。當首次碰到這個問題時,人們的第一個想法是寫這樣的代碼:yesterday = today - 1,但其結果是一個TypeError: unsupported operand type(s) for -: 'datetime.date' and 'int'。
一些人認為這是個bug,并暗示Python應該能夠猜測出他們的意圖。然而,Python的一個指導原則是:"在模糊含混面前拒絕猜測",這也是Python簡潔和強大的原因。猜測意味着需要用啟發的方式将datetime割裂開來,需要猜測你想減去的究竟是1天還是1秒,再或者幹脆是1年?
Python如同它一貫的方式,并不嘗試猜測你的意圖,而是期待你明确指定你自己的意圖。如果想減去長度為1天的一個時間差,應當明确地編寫相關代碼。再或者,想加上長度為1秒的時間內插補點,可以使用timedelta配合datetime.datetime對象,這樣可以用同樣的文法編寫相關操作。也許對每個任務都想使用這種方法,因為這種方法給了你足夠的自由度,同時還保持着簡潔直覺。考慮下面的片段:
-
>>>anniversary = today + datetime.timedelta(days=365)
# 增加1年
- >>> print anniversary
- 2005-11-18
-
>>>t = datetime.datetime.today( )
# 獲得現在的時間
- >>> t
- datetime.datetime(2004, 11, 19, 10, 12, 43, 801000)
-
>>>tt2 = t + datetime.timedelta(seconds=1)
# 增加1秒
- >>> t2
- datetime.datetime(2004, 11, 19, 10, 12, 44, 801000)
-
>>>tt3 = t + datetime.timedelta(seconds=3600)
# 增加1小時
- >>> t3
- datetime.datetime(2004, 11, 19, 11, 12, 43, 801000)
如果你想在日期和時間的計算上有點新花樣,可以使用第三方包,如dateutil(可以和内建的datetime協同工作)和經典的mx.DateTime。舉個例子:
- from dateutil import relativedelta
- nextweek = today + relativedelta.relativedelta(weeks=1)
- print nextweek