2015-05-26 4 views
1

Моя цель - найти дату определенного дня в данную неделю этого месяца. Скажем, например, я хочу знать дату в пятницу, 2 мая. Я могу получить следующие классы времени и даты.Как рассчитать текущую неделю за месяц в Ruby

Номер недели текущего года (с учетом воскресенье как первый)

Time.strftime(%U) 

день недели (0..7)

Time.strftime(%w) 

Но как я получаю какую неделю (1-й, 2-й , 3-й, 4-й или 5-й) месяца, в котором он находится?

Заранее благодарен!

+0

Можете ли вы определить вашу первую неделю? Или когда начинается вторая неделя? Пример: [Iso week date] (http://en.wikipedia.org/wiki/ISO_week_date#First_week) определяет неделю 01 в году как неделю с первым в этом году в этом году. – knut

+0

Да. в соответствии со стандартами ISO – user1725651

ответ

1

Для того, чтобы справиться с требованиями, которые вы перечислили, я хотел бы предложить писать вспомогательную функцию получите номер недели в месяц.

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 

Я бы посоветовал против этого, так как он может столкнуться с другими библиотеками или нарушать наименее сюрприз для других разработчиков, работающих над проектом.

+0

Большое спасибо! Оно работает. – user1725651

0

Жемчуг week-of-month сделает это. Сначала добавьте драгоценный камень в ваш Gemfile:

gem 'week_of_month' 

Затем используйте это нравится:

Time.now.week_of_month 

Если вам нужна неделя, чтобы начать в понедельник вместо воскресенья. Палка это в инициализаторе:

WeekOfMonth.configuration.monday_active = true 
0

Вы можете попробовать это:

current_time = Time.zone.now 
beginning_of_the_month = current_time.beginning_of_month 
puts current_time.strftime('%U').to_i - beginning_of_the_month.strftime('%U').to_i + 1 

Или

Time.parse('2015-01-08').strftime('%U').to_i - Time.parse('2015-01-01').strftime('%U').to_i + 1 
0
def number_of_weeks_month(start_of_month, count, end_of_month) 
    if start_date > end_of_month 
     return count 
    else 
     number_of_weeks_month(start_date.end_of_week + 1, count + 1, end_of_month) 
    end 
end 

number_of_weeks_month(Date.parse("2017-11-01"),0,Date.parse("2017-11-30")) в течение месяца ноября он дает 4

Смежные вопросы