python datetime 增長月份的問題

個人主要工做是從事.net開發,記得.net中有相應的對DateTime月份加減操做。然而在學習python datetime類型的時候卻發現對月份沒有相應操做。 python

在python中對datetime類型的操做主要涉及到兩個對象,1.datetime 2.timedelta 其中後者爲一個時間差對象。至關於.net中的TimeSpan類對象。學習

 在個人開發中須要對日期進行月份加減的過程當中,我理所固然的找到了timedelta,然而發現這個類中沒有對月份的參數,它的定義以下:.net

 class datetime.timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]]) 因而網上找到一些解決辦法: 設計

def add_months(dt,months):
    targetmonth=months+dt.month
    try:
        dt=dt.replace(year=dt.year+int(targetmonth/12),month=(targetmonth%12))
    except:
        dt=dt.replace(year=dt.year+int((targetmonth+1)/12),month=((targetmonth+1)%12),day=1)
        dt+=datetime.datetime.timedelta(days=-1)
    return dt

  整體的思路就是: 拿出給定時間的月份加上指定個月,超過一年在年上+1, 月份取模後餘值。這裏就設計到一個問題:若是8月31日加1月的話,那麼就會變成9月31日,顯然9月不存在31日,該方案是在異常的時候對這種狀況進行了處理。(取下月的第一天,而後減去一天) 

原本已經實現了,後來無聊琢磨着這個事情,所謂的加一個月或者幾個月咱們想獲得的是什麼?由於月份不是個固定的數量,應該是這個緣由python把具體的實現留給了咱們把。code

 +1月,咱們要獲得的是下月的這天,對於月末的一天,如咱們距離的8月31日,若是+1月,應該獲得9月31日,因爲這天不存在因此咱們取9月末的30號爲結果。這樣就出現了8月30日、8月31日+1月的結果都是9月30日的結果。(用.net的AddMonths驗證結果也如此)。 對象

在上面給出的解決辦法中,因爲要拋異常,顯然不是個很好的辦法,下面給出幾種其餘辦法:開發

 1.本身實現,沒有了拋異常的部分 get

def add_months(dt,months):
    month = dt.month - 1 + months
    year = dt.year + month / 12
    month = month % 12 + 1
    day = min(dt.day,calendar.monthrange(year,month)[1])
    return dt.replace(year=year, month=month, day=day)

 2.利用其餘人實現的日期操做包, 如dateutilclass

相關文章
相關標籤/搜索