業務場景:python
咱們常常會跑一些月級別或者周級別的報表。算法
周級別的報表還比較好肯定,就是七天前的直接用timedelta(days=7)來獲取開始日期就能夠了;函數
可是月級別的報表就要麻煩一些,由於timedelta這個函數沒有month這個參數,那咱們怎麼來獲取一個月前的一號呢,還要考慮到這個月有多少天,會不會跨年,之類的...學習
我今天想到了一個簡單的辦法,分享給你們spa
有了這個辦法,就不用再去判斷閏年那些很麻煩的邏輯了code
若是你們發現這個算法有什麼問題能夠指出來,共同窗習blog
1 from datetime import date 2 from datetime import timedelta 3 4 def get_last_month_first_day(date): 5 date_terminal = 26 + date.day 6 res_date = date - timedelta(days=date_terminal) 7 while 1: 8 if res_date.day == 1: 9 break 10 else: 11 res_date -= timedelta(days=1) 12 return res_date 13 14 15 if __name__ == '__main__': 16 test_date_a = date(2016, 9,3) 17 test_date_b = date(2016, 10, 1) 18 test_date_c = date(2016, 2, 28) 19 test_date_d = date(2016, 1, 1) 20 print map(get_last_month_first_day, [ 21 test_date_a, test_date_b, test_date_c, test_date_d])
----------------2017-07-16-------------------------terminal
如今再看這道題,我又有了新的辦法,對比以前的寫法不知道好了多少get
def get_last_month_first_day_v2(d): return datetime.date(d.year - (d.month==1), d.month - 1 or 12, 1)