2011年3月3日木曜日

Ruby: 指定された日が何月の何周目かを求める

タイトルのようなものが必要になった。
考えるのが面倒くさかったため、ネットで答えを探したが
うまく見つけることができなかったため、固い頭を使って
考えてみた。
その結果を晒します。

■仕様
  • 月曜日基点で考える。
  • 月曜日が所属する月にその週は属する。
例でいうと以下のとおり。(2011-03-03の場合)
2011年
2月-3週 21 22 23 24 25 26 27
2月-4週 28 1 2 3 4 5 6
3月-1週 7 8 9 10 11 12 13

実際のコードは以下。
def mweek(date)
  day = date - (date.cwday - 1)
  base_month = day.month

  week = 0
  (1..5).each do |index|
    day -= 7
    if base_month != day.month
      week = index
      break
    end
  end

  { :month => base_month, :week => week}
end

解説:
cwday で週を数字化して月曜日が 基点になるように補正。日付を移動させる。
あとは基点月が所属する月から何周目かをカウントするだけ。
復帰値は月と何周目かの Hash 値。複数の復帰値が返せる curl や scala が便利と感じる。
*よくテストしていないので、BUGがあるかもしれません。

0 件のコメント: