pythonのcalendar.Calendar

webページにカレンダーを表示しようと思って調べてて、pythonにcalendarモジュールが用意されてるのを知った。

そういえば、指定した月の日数を取得するのにcalendar.monthrangeを使ったことがあったけど、他にもいろいろ機能が用意されていた。


例えば当月のカレンダーをhtmlで表示するのにHTMLCalendarが用意されている

from calendar import SUNDAY, HTMLCalendar
from datetime import date


c = HTMLCalendar(SUNDAY)

today = date.today()

print c.formatmonth(today.year, today.month)
<table border="0" cellpadding="0" cellspacing="0" class="month">
<tr><th colspan="7" class="month">July 2013</th></tr>
<tr><th class="sun">Sun</th><th class="mon">Mon</th><th class="tue">Tue</th><th class="wed">Wed</th><th class="thu">Thu</th><th class="fri">Fri</th><th class="sat">Sat</th></tr>
<tr><td class="noday">&nbsp;</td><td class="mon">1</td><td class="tue">2</td><td class="wed">3</td><td class="thu">4</td><td class="fri">5</td><td class="sat">6</td></tr>
<tr><td class="sun">7</td><td class="mon">8</td><td class="tue">9</td><td class="wed">10</td><td class="thu">11</td><td class="fri">12</td><td class="sat">13</td></tr>
<tr><td class="sun">14</td><td class="mon">15</td><td class="tue">16</td><td class="wed">17</td><td class="thu">18</td><td class="fri">19</td><td class="sat">20</td></tr>
<tr><td class="sun">21</td><td class="mon">22</td><td class="tue">23</td><td class="wed">24</td><td class="thu">25</td><td class="fri">26</td><td class="sat">27</td></tr>
<tr><td class="sun">28</td><td class="mon">29</td><td class="tue">30</td><td class="wed">31</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td></tr>
</table>


HTMLCalendarの代わりにLocaleHTMLCalendarを使うと、曜日の表示をロケールによって変更することができる

from calendar import SUNDAY, LocaleHTMLCalendar
from datetime import date


c = LocaleHTMLCalendar(SUNDAY)

today = date.today()

print c.formatmonth(today.year, today.month)
<table border="0" cellpadding="0" cellspacing="0" class="month">
<tr><th colspan="7" class="month">7月 2013</th></tr>
<tr><th class="sun"></th><th class="mon"></th><th class="tue"></th><th class="wed"></th><th class="thu"></th><th class="fri"></th><th class="sat"></th></tr>
<tr><td class="noday">&nbsp;</td><td class="mon">1</td><td class="tue">2</td><td class="wed">3</td><td class="thu">4</td><td class="fri">5</td><td class="sat">6</td></tr>
<tr><td class="sun">7</td><td class="mon">8</td><td class="tue">9</td><td class="wed">10</td><td class="thu">11</td><td class="fri">12</td><td class="sat">13</td></tr>
<tr><td class="sun">14</td><td class="mon">15</td><td class="tue">16</td><td class="wed">17</td><td class="thu">18</td><td class="fri">19</td><td class="sat">20</td></tr>
<tr><td class="sun">21</td><td class="mon">22</td><td class="tue">23</td><td class="wed">24</td><td class="thu">25</td><td class="fri">26</td><td class="sat">27</td></tr>
<tr><td class="sun">28</td><td class="mon">29</td><td class="tue">30</td><td class="wed">31</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td></tr>
</table>


TextCalendarを利用すると、calと同じような出力が得られる

from calendar import SUNDAY, TextCalendar
from datetime import date


c = TextCalendar(SUNDAY)

today = date.today()

print c.formatmonth(today.year, today.month)
     July 2013
Su Mo Tu We Th Fr Sa
    1  2  3  4  5  6
 7  8  9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31


TextCalendarやHTMLCalendarはCalendarクラスのサブクラスである。

独自のカレンダーを作成したい場合は、同じくCalendarを継承して実装するか、その機能を使って実装できると思う。


例えばCalendarのmonthdatescalendarは1週間毎にdatetime.dateのlistを得るジェネレータを返す

# coding=utf-8
from calendar import SUNDAY, Calendar
from datetime import date


c = Calendar(SUNDAY)

today = date.today()

print list(c.monthdatescalendar(today.year, today.month))
#[[datetime.date(2013, 6, 30), datetime.date(2013, 7, 1), datetime.date(2013, 7, 2), datetime.date(2013, 7, 3), datetime.date(2013, 7, 4), datetime.date(2013, 7, 5), datetime.date(2013, 7, 6)],
# [datetime.date(2013, 7, 7), datetime.date(2013, 7, 8), datetime.date(2013, 7, 9), datetime.date(2013, 7, 10), datetime.date(2013, 7, 11), datetime.date(2013, 7, 12), datetime.date(2013, 7, 13)],
# [datetime.date(2013, 7, 14), datetime.date(2013, 7, 15), datetime.date(2013, 7, 16), datetime.date(2013, 7, 17), datetime.date(2013, 7, 18), datetime.date(2013, 7, 19), datetime.date(2013, 7, 20)],
# [datetime.date(2013, 7, 21), datetime.date(2013, 7, 22), datetime.date(2013, 7, 23), datetime.date(2013, 7, 24), datetime.date(2013, 7, 25), datetime.date(2013, 7, 26), datetime.date(2013, 7, 27)],
# [datetime.date(2013, 7, 28), datetime.date(2013, 7, 29), datetime.date(2013, 7, 30), datetime.date(2013, 7, 31), datetime.date(2013, 8, 1), datetime.date(2013, 8, 2), datetime.date(2013, 8, 3)]]