rails で日付を扱うメソッドが足りないので作ってみた

activesupport だと、日付を扱うときに「うーん???」ってなることが多くてイライラっとするわけです。
なんかこう、直感的かつ富豪的にこんなの取りたいじゃん、みたいな。

  • 月の日付の array がすぐほしい!
  • 月の月曜日の array がすぐほしい!
  • 一ヶ月分の「週→日」がマッピングされた array がすぐほしい!

ってことで作ってみました!添削お願いします!

module SpecialTime

  # 当月の日の配列(in 数値)
  def days
    (1..Time.days_in_month(self.month)).to_a
  end

  # 当月の wday 曜日の配列(in 数値)
  def day_of_week(wday)
    ary = []
    self.days.each do |day|
      ary << day if Time.local(self.year, self.month, day).wday == wday
    end
    ary
  end

  # 当月の日曜日の配列(in 数値)
  def sundays; day_of_week 0; end

  # 当月の月曜日の配列(in 数値)
  def mondays; day_of_week 1; end

  # 当月の火曜日の配列(in 数値)
  def tuesdays; day_of_week 2; end

  # 当月の水曜日の配列(in 数値)
  def wednesdays; day_of_week 3; end

  # 当月の木曜日の配列(in 数値)
  def thursdays; day_of_week 4; end

  # 当月の金曜日の配列(in 数値)
  def fridays; day_of_week 5; end

  # 当月の土曜日の配列(in 数値)
  def saturdays; day_of_week 6; end

  # 当月の一週間ごとの配列の配列(in 数値)
  # +wday+:: 週の始まりの曜日を指定します(0:日曜日〜6:土曜日)。デフォルトは月曜日です。
  def weeks(wday = 1)
    weeks = []
    days = self.days
    self.send(:day_of_week, wday).each do |m|
      weeks << []
      while true
        day = days.shift
        if day < m
          weeks.last << day
        else
          days.unshift day
          break
        end
      end
    end
    weeks << days
    weeks.shift if weeks.first.empty?
    return weeks
  end

end

class Time
  include SpecialTime
end

上記を lib/special_time.rb とかなんとかで保存して。
使った感はこんな感じ。

$ ruby script/console
Loading development environment.
>> require 'special_time'
=> ["SpecialTime"]
>> t = Time.today
=> Sat Jun 30 00:00:00 +0900 2007
>> t.days
=> [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]
>> t.mondays
=> [4, 11, 18, 25]
>> t.weeks
=> [[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]]


自分的には mondays とか sundays あたりのメソッドがループ一発で実装できるかなーと思ったけどナイスなのが出なかったです ><