Skip to content

Instantly share code, notes, and snippets.

@komiya-atsushi
Created August 6, 2012 01:57
Show Gist options
  • Save komiya-atsushi/3269033 to your computer and use it in GitHub Desktop.
Save komiya-atsushi/3269033 to your computer and use it in GitHub Desktop.
指定された日付が、その月において何週目にあたるのかを計算する Ruby のメソッド
require 'date'
#
# 指定された日付が、その月において何週目にあたるのかを計算し、返却します。
#
# 週始まりは月曜です。初週を 1 としています。
#
def week_of_month(date)
first_week = (date - (date.day - 1)).cweek
this_week = date.cweek
# 年末は暦週が 1 になったり、逆に年始に暦週が 53 に
# なることがあるため、その対処を以下でする
if this_week < first_week
if date.month == 12
# 年末の場合は、前週同曜日の週番号を求めて + 1 してあげればよい
# ここを通ることがあるのは、大晦日とその前の数日となる
return week_of_month(date - 7) + 1
else
# 年始の場合は、月初の数日が 53 週目に組み込まれてしまっている
# 二週目以降にここを通ることがある
return this_week + 1
end
end
return this_week - first_week + 1
end
require 'test/unit'
class Test_week_of_month < Test::Unit::TestCase
DATE_FORMAT = "%Y/%m/%d"
def test_2007_1_1_is_1()
assert_equal(1, week_of_month(Date.strptime("2007/01/01", DATE_FORMAT)))
end
def test_2007_12_31_is_6()
assert_equal(6, week_of_month(Date.strptime("2007/12/31", DATE_FORMAT)))
end
def test_2008_1_1_is_1()
assert_equal(1, week_of_month(Date.strptime("2008/01/01", DATE_FORMAT)))
end
def test_2008_12_31_is_5()
assert_equal(5, week_of_month(Date.strptime("2008/12/31", DATE_FORMAT)))
end
def test_2009_1_1_is_1()
assert_equal(1, week_of_month(Date.strptime("2009/01/01", DATE_FORMAT)))
end
def test_2009_12_31_is_5()
assert_equal(5, week_of_month(Date.strptime("2009/12/31", DATE_FORMAT)))
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment