04 7月 2008

[Python] datetime取得當月份天數

Python並沒有提供datetime中month的天數(一個月,最多幾天),所以必須要用算的把它算出來,是有點麻煩。以下是我個人的作法,如果有比較好的作法,歡迎交流:)

import datetime
def DaysOfMonth( dt ): #dt的type是datetime or date皆可
#先加一個月,避免邊界值問題。
if dt.day < 15 :
dt = dt+datetime.timedelta(31)
else:
dt = dt+datetime.timedelta(20)
dt = dt+datetime.timedelta(days=(-dt.day))#再扣掉天數
return dt.day

dt = datetime.datetime(2008,7,4)
print DaysOfMonth(dt)
# output>> 31

dt = datetime.date(2008,7,4)
print DaysOfMonth(dt)
# output>> 31

6 則留言:

  1. 你好,你的程序有点错误
    比如:
    >>> a = datetime.datetime(2009,1,29)
    >>> DaysOfMonth(a)
    28
    >>> a = datetime.datetime(2009,1,2)
    >>> DaysOfMonth(a)
    31
    >>>

    回覆刪除
  2. 主要是边界问题,你纯粹加31
    如果他跨越了一个月,那个月的天数少于31天,那计算的就是下个月的天数了
    比如下面,计算的是6月份的
    >>> a = datetime.datetime(2009,5,31)
    >>> DaysOfMonth(a)
    30

    回覆刪除
  3. 感謝你的寶貴意見,這段code果然有些問題,我已經修正了~ :)

    回覆刪除
  4. 还有更加简单的
    可以用下个月的第一天,减去这个月的第一天,其中的天数就是这个月的天数啊:
    a = datetime.datetime(2009,3,1)
    b = datetime.datetime(2009,2,1)
    c = a - b
    则2月的天数就是c.days

    回覆刪除
  5. 嗯 這的確也是個不錯的方法,但是要寫成可以共用的function,還是必須判斷1月、12月的臨界值,所以效率、方法應該是大同小異的:)

    回覆刪除
  6. I like the way c = a -b , straightforward

    回覆刪除