Для того, чтобы справиться с требованиями, которые вы перечислили, я хотел бы предложить писать вспомогательную функцию получите номер недели в месяц.
def get_month_week(date_or_time, start_day = :sunday)
date = date_or_time.to_date
week_start_format = start_day == :sunday ? '%U' : '%W'
month_week_start = Date.new(date.year, date.month, 1)
month_week_start_num = month_week_start.strftime(week_start_format).to_i
month_week_start_num += 1 if month_week_start.wday > 4 # Skip first week if doesn't contain a Thursday
month_week_index = date.strftime(week_start_format).to_i - month_week_start_num
month_week_index + 1 # Add 1 so that first week is 1 and not 0
end
Это может тогда просто называться так:
get_month_week(Date.today)
Если вы действительно чувствуете, как обезьяна-латание является то, что вы хотите, вы можете добавить в класс Date:
class Date
def month_week(start_day = :sunday)
week_start_format = start_day == :sunday ? '%U' : '%W'
month_week_start = Date.new(self.year, self.month, 1)
month_week_start_num = month_week_start.strftime(week_start_format).to_i
month_week_start_num += 1 if month_week_start.wday > 4 # Skip first week if doesn't contain a Thursday
month_week_index = self.strftime(week_start_format).to_i - month_week_start_num
month_week_index + 1 # Add 1 so that first week is 1 and not 0
end
end
И это можно назвать на дату или время, например:
Date.today.month_week
или
Time.current.to_date.month_week
Я бы посоветовал против этого, так как он может столкнуться с другими библиотеками или нарушать наименее сюрприз для других разработчиков, работающих над проектом.
Можете ли вы определить вашу первую неделю? Или когда начинается вторая неделя? Пример: [Iso week date] (http://en.wikipedia.org/wiki/ISO_week_date#First_week) определяет неделю 01 в году как неделю с первым в этом году в этом году. – knut
Да. в соответствии со стандартами ISO – user1725651