天天看點

python 取日期

3.1 計算昨天和明天的日期

感謝:Andrea Cavalcanti

任務

你想獲得今天的日期,并以此計算昨天和明天的日期。

解決方案

無論何時你遇到有關"時間變化"或者"時間差"的問題,先考慮timedelta:

  1. import datetime
  2. today = datetime.date.today( )
  3. yesterday = today - datetime.timedelta(days=1)
  4. tomorrow = today + datetime.timedelta(days=1)
  5. print yesterday, today, tomorrow
  6. #輸出: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對象,這樣可以用同樣的文法編寫相關操作。也許對每個任務都想使用這種方法,因為這種方法給了你足夠的自由度,同時還保持着簡潔直覺。考慮下面的片段:

  1. >>>anniversary = today + datetime.timedelta(days=365)

    # 增加1年

  2. >>> print anniversary
  3. 2005-11-18
  4. >>>t = datetime.datetime.today( )

    # 獲得現在的時間

  5. >>> t
  6. datetime.datetime(2004, 11, 19, 10, 12, 43, 801000)
  7. >>>tt2 = t + datetime.timedelta(seconds=1)

    # 增加1秒

  8. >>> t2
  9. datetime.datetime(2004, 11, 19, 10, 12, 44, 801000)
  10. >>>tt3 = t + datetime.timedelta(seconds=3600)

    # 增加1小時

  11. >>> t3
  12. datetime.datetime(2004, 11, 19, 11, 12, 43, 801000)

如果你想在日期和時間的計算上有點新花樣,可以使用第三方包,如dateutil(可以和内建的datetime協同工作)和經典的mx.DateTime。舉個例子:

  1. from dateutil import relativedelta
  2. nextweek = today + relativedelta.relativedelta(weeks=1)
  3. print nextweek