Pythonでうるう年や月末日(28日/30日/31日)を簡単に求める方法

2010年2月14日

Webなどで日時情報(7月1日〜7月31日までなど)を表示するとき、月末日が 30日の月なのか、31日の月なのか?など計算に困ることがありますよね。 

そんなとき、Pythonのtimeクラスを用いると簡単に月末日を求めることができます。
まずは、以下に例を記述します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
def date2int(time_str):
    """
    2008/07/01のような日付フォーマットをエポック時間に変換する。
    """
    return time.mktime( time.strptime(time_str, "%Y/%m/%d") )

def int2date(time_int):
    """
    エポック時間を2008/07/01のような日付フォーマットに変換する。
    """
    return time.strftime( "%Y/%m/%d", time.gmtime(time_int) )

idate = "2008/08/01"
aday = 24*3600        # 一日分の秒数 
end_of_july_int = date2int(idate) - aday 
end_of_july = int2date(end_of_july_int)
print "date: %s" % end_of_july
1
2
# 出力結果 
date: 2008/07/31

月末日を求めるポイントは上記の赤色の行のように、

求めたい月末付きの翌月の日時を 用意(この例では2008/08/01)し、

それから一日分の経過時間(=aday)を引くことところに あります。


これで、閏年だろうが、30 or 31日の月だろうが統一して扱うことが可能となります。