2017-03-23 105 views
0

12月份出錯。在python中獲取月份的最後一天

ValueError: month must be in 1..12

def last_day_of_month(ds): 
    cur_ds = datetime.strptime(ds, '%Y-%m-%d') 
    next_month = datetime(year=cur_ds.year, month=cur_ds.month+1, day=1) 
    last_day_month = next_month - timedelta(days=1) 
    return datetime.strftime(last_day_month, '%Y-%m-%d') 

print last_day_of_month('2016-12-01') 
+3

很明顯,如果月份是十二月(12),那麼'month = cur_ds.month + 1'會是13,對不對?顯然13不是一個允許的月份,就像錯誤說的那樣? –

+0

是的,如果條件爲 – paddu

+0

,您可以使用'%12',對不對? –

回答

2

你不能讓一個datetime用一個月的13所以你必須找到一個方法來解決它。一個簡單的解決方案是將每月遞增轉換成一個額外的一年:

# Reduce 12 to 1, 0 and all other #s to 0, # 
extrayear, month = divmod(cur_ds.month, 12) 
# Add 1 or 0 to existing year, add one to month (which was reduced to 0-11) 
next_month = datetime(year=cur_ds.year + extrayear, month=month + 1, day=1) 
+0

謝謝。那工作 – paddu

0

你在12傳遞爲當月,然後添加一個拿到next_month,使其13。請檢查12的情況並設置month=1

2

第3行month=cur_ds.month+1您給予第13個月無效。如果您想計算給定月份的最後一天,則還可以使用日曆庫中的月份範圍。

>>import calendar 
>>year, month = 2016, 12 
>>calendar.monthrange(year, month)[1] 
31 
+1

哦,直接解決真正的問題。我同意。 Upvoted。我總是忘記['calendar'模塊](https://docs.python.org/3/library/calendar.html)甚至存在。 – ShadowRanger

+0

哈哈耶,這是我的日常生活,寫點東西然後意識到這是一個模塊:/ – umutto

+1

可能會更糟糕。可能已經存在,但您的遺留代碼庫不能使用它。或者它在寫完一個月後創建。我有兩個,當一個2.7代碼庫需要能夠便宜地緩存棧跟蹤(所以如果出現調試場景,可以稍後輸出它們)。我在3.5發佈前一個月基本上發明了['traceback.StackSummary(lookup_lines = False)'](https://docs.python.org/3/library/traceback.html#traceback.StackSummary)(當然,我本人那麼即使使用'StackSummary',因爲代碼是2.7,而且太難以移到3.x)。嘆息...... :-) – ShadowRanger

相關問題