今月のカレンダーを出力

わりとキレイに書けたような気がする。
たのしいRubyの練習問題にも似たようなのあったなぁ。

require "date"

def calendar
  today = Date.today
  fday = Date.new(today.year, today.month, 1)
  lday = Date.new(today.year, today.month, -1)
  # Date#wday は週の何日目かを表す。日曜が0。月曜を0にしたいので-1する。
  wday = fday.wday - 1
  # 日曜日の場合は-1なので6に変更する。
  wday = 6 if wday == -1

  puts today.strftime("%Y %B").center(20)
  puts "--------------------"
  puts "Mo Tu We Th Fr Sa Su"
  print "   " * (wday)
  fday.day.upto(lday.day){|d|
    print "%2d " % d
    wday += 1
    if wday == 7
      puts
      wday = 0
    end
  }
  
end

calendar


実行結果はこんな感じ。

     2007 June
--------------------
Mo Tu We Th Fr Sa Su
             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