Created
August 6, 2012 01:57
-
-
Save komiya-atsushi/3269033 to your computer and use it in GitHub Desktop.
指定された日付が、その月において何週目にあたるのかを計算する Ruby のメソッド
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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