timedelta函數和relativedelta

時間問題是一個經常會遇到的問題,我們在使用python處理時間問題時最長用的是time和datetime這兩個模塊,一般來講,這兩個模塊足以解決工作中遇到的大部分問題了,但是基於兩個原因,今天來記錄一下另外一個模塊---relativedelta的運用,原因一:後者較前者來說功能更加全面而強大,原因二:即便是相同的功能,後者較前者相對簡單快捷。

首先講一下經常碰到的時間差,關於時間的加減的問題:


datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)

先講一下這個timedelta模塊,如上,參數部分就是上面這些。觀察這些參數你會有所發現,就是缺少月和年,這也爲後面的relativedelta的方便快捷埋下伏筆。

看一下怎麼運用:

#計算時間差
d1 = datetime.datetime.strptime('2012-03-05 17:41:20', '%Y-%m-%d %H:%M:%S')
d2 = datetime.datetime.strptime('2012-03-02 17:41:20', '%Y-%m-%d %H:%M:%S')
delta = d1 - d2
print( delta.days)


#計算相對時間
now = datetime.datetime.now()
delta = datetime.timedelta(days=3)
n_days = now + delta
print (n_days.strftime('%Y-%m-%d %H:%M:%S'))

ps:在用這個模塊之前一定要把時間格式轉換正確,有一個問題就是,如果我想知道一個月後的時間日期,該怎麼辦?,days=30?那1、3、5、7這些特殊的月份呢?還有一個更加特殊的2月份呢?還有考慮平閏年問題呢?怎麼解決呢?或許你能解決,但是會發現麻煩很多,這個時候relativedelta就可以爲你解決這些麻煩了。

這個相對時間差,查看源碼可以看到如下:

    def __init__(self, dt1=None, dt2=None,
                 years=0, months=0, days=0, leapdays=0, weeks=0,
                 hours=0, minutes=0, seconds=0, microseconds=0,
                 year=None, month=None, day=None, weekday=None,
                 yearday=None, nlyearday=None,
                 hour=None, minute=None, second=None, microsecond=None):

看到定義的參數,是不是已經贏了,而且相對時間差會根據月份的情況自己調整,不需要你再去考慮是30天還是31天,是2月還是其他,是閏年還是平年,是不是給你省去來樂很多的煩惱。

接下來看一下怎麼去運用:

#導入模塊
from dateutil.relativedelta import relativedelta

#計算相對時間差
relativedelta(datetime1, datetime2)#注意時間格式


#一年後
>>> date(2000,2,28)+relativedelta(years=+1)
datetime.date(2001, 2, 28)
#一個月後
>>> date(2003,1,27)+relativedelta(months=+1)
datetime.date(2003, 2, 27)
#下一個週五
>>> TODAY+relativedelta(weekday=FR)
datetime.date(2003, 9, 19)

>>> TODAY+relativedelta(weekday=calendar.FRIDAY)
datetime.date(2003, 9, 19)

#這個月的最後一個週五
>>> TODAY+relativedelta(day=31, weekday=FR(-1))
datetime.date(2003, 9, 26)

#一週後
>>> TODAY+relativedelta(weekday=WE(+1))
datetime.date(2003, 9, 17)

更多更細節的用法大家自己來探索吧,最後附上一個英文文檔,習慣的可以看一下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章