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 あたりのメソッドがループ一発で実装できるかなーと思ったけどナイスなのが出なかったです ><