今月の末日を求める

ライブラリリファレンスには載っていませんが、calendarモジュールに「mdays」という各月の日数を並べたリストがあります。せっかくdatetimeモジュールを使っているのに[0, 31, 28, 31, 30, ...]なんてリストを自前で作るのはシャクに障るのでこれを使ってみます。

from calendar import mdays, isleap
from datetime import date

## 同じ月の末日を返す
def lastdayofmonth(d):
    lastday = mdays[d.month]
    if d.month == 2 and isleap(d.year):
         lastday += 1
    return d.replace(day=lastday)

d = date(2007,12,2)
print d
print lastdayofthismonth(d)
2007-12-02
2007-12-31

もし「公式に載ってないものを使うのはちょっと…」ということであれば、変なやり方かもしれませんが、次のような方法もあります。

from datetime import date, timedelta

## 来月の1日を返す
def firstdayofnextmonth(d):
    return (d.replace(day=28)+timedelta(days=4)).replace(day=1)

## 同じ月の末日を返す
def lastdayofmonth(d):
    return firstdayofnextmonth(d)-timedelta(days=1)

d = date(2007,12,2)
print d
print lastdayofmonth(d)
2007-12-02
2007-12-31