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"> </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"> </td><td class="noday"> </td><td class="noday"> </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"> </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"> </td><td class="noday"> </td><td class="noday"> </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)]]