頭の中は異空間

生活を日々ハックしてよりよくするブログ

【Ruby】カレンダー表示用日付配列を作成してみる

仕事で必要になって年度ごとカレンダーを表示するためのクラスを作ったので、ついでにメモしておきます。

 

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の部分を引数で渡せば好きな月のカレンダーを表示できます。