仕事で必要になって年度ごとカレンダーを表示するためのクラスを作ったので、ついでにメモしておきます。
code
Rails
def make_calendar today = Date.today calendar = {} start_day = today.beginning_of_month start_week = [1, 2, 3, 4, 5, 6, 7] end_week = ["", "", "", "", "", "", ""] end_day = today.end_of_month middle_week = [] middle_days = [] start_week.count.times do |index| index >= start_day.wday ? start_week[index] = index - start_day.wday + 1 : start_week[index] = "" end (end_day.wday + 1).times do |index| end_week.unshift(end_day.day - index) end_week.delete_at(-1) end week_day = 7 last_day = start_week[start_week.count - 1] ((end_week[0] - start_week[start_week.count - 1] - 1) / week_day).times do |index| middle_days = [] week_day.times do |day| middle_days.push last_day + day + 1 end last_day = middle_days[middle_days.count - 1] middle_week.push middle_days end { start_week: start_week, middle_week: middle_week, end_week: end_week } end
HTML(erb)
<% calendar = make_calendar %> ~~~ <%# 最初の週 %> <% calendar[:start_week].each do |day| %> <%= day %> <% end %> <%# 間の週 %> <% calendar[:middle_week].each do |middle_week| %> <% middle_week.each do |day| %> <%= day %> <% end %>
<%# この辺で折り返しさせたい %> <% end %> <%# 最後の週 %> <% calendar[:end_week].each do |end_week| %> <%= day %> <% end %>
考察
カレンダーをPCなり壁がけの紙でも良いので見てみると、最初と最後の週には前後の月の日付が入っていることに気づくはずです。ここではその前後の月にあたる日付を省いた、その表示したい月の日付のみを表示させます。first_week、 end_weekがそれに当たります。繰り返しのところに改行を挟んで表示させればそれっぽく見えるでしょう。CSSまで当てれば自分のオリジナルカレンダーが作れます。
ここではRubyで書いていますが、他の言語でも勿論応用可能。todayの部分を引数で渡せば好きな月のカレンダーを表示できます。