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 則留言:

神怡 提到...

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

神怡 提到...

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

Falldog 提到...

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

神怡 提到...

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

Falldog 提到...

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

匿名 提到...

I like the way c = a -b , straightforward