Подтвердить что ты не робот

Rails 3.2.8. Как получить номер недели из Rails?

Я хотел бы знать, как получить текущий номер недели из Rails и как я могу манипулировать им:

  • Перевести номер недели на дату.
  • Сделать интервал на основе номера недели.

Спасибо.

4b9b3361

Ответ 1

Используйте strftime:

%U - номер недели в году. Неделя начинается с воскресенья. (00..53)
%W - номер недели года. Неделя начинается с понедельника. (00..53)

Time.now.strftime("%U").to_i # 43

# Or...

Date.today.strftime("%U").to_i # 43

Если вы хотите добавить 43 недели (или дни, годы, минуты и т.д.) к дате, вы можете использовать 43.weeks, предоставленный ActiveSupport:

irb(main):001:0> 43.weeks
=> 301 days

irb(main):002:0> Date.today + 43.weeks
=> Thu, 22 Aug 2013

irb(main):003:0> Date.today + 10.days
=> Sun, 04 Nov 2012

irb(main):004:0> Date.today + 1.years # or 1.year
=> Fri, 25 Oct 2013

irb(main):005:0> Date.today + 5.months
=> Mon, 25 Mar 2013

Ответ 2

Вы захотите держаться подальше от strftime("%U") и "%W".

Вместо этого используйте Date.cweek!

Проблема в том, что если вы когда-нибудь захотите взять номер недели и преобразовать ее в дату, strftime не даст вам значения, которые вы можете передать обратно на Date.commercial.

Date.commercial ожидает диапазон значений, основанных на 1. Date.strftime("%U|%W") возвращает значение, основанное на 0. Вы могли бы подумать, что вы могли бы просто +1, и все будет хорошо. Проблема поразит вас в конце года, когда есть 53 недели. (Как то, что только что произошло...)

Например, давайте посмотрим на конец декабря 2015 года и на результаты ваших двух вариантов получения номера недели:

Date.parse("2015-12-31").strftime("%W") = 52
Date.parse("2015-12-31").cweek = 53

Теперь посмотрим, как преобразовать номер этой недели в дату...

Date.commercial(2015, 52, 1) = Mon, 21 Dec 2015
Date.commercial(2015, 53, 1) = Mon, 28 Dec 2015

Если вы вслепую просто добавили значение, которое вы передадите на Date.commercial, в противном случае вы получите недопустимую дату:

Например, декабрь 2014 года:

Date.commercial(2014, 53, 1) = ArgumentError: invalid date

Если вам когда-либо понадобится преобразовать номер этой недели обратно в дату, единственным способом обеспечения конфиденциальности является Date.cweek.

Ответ 3

date.commercial([cwyear=-4712[, cweek=1[, cwday=1[, start=Date::ITALY]]]]) → date
Creates a date object denoting the given week date.

The week and the day of week should be a negative 
or a positive number (as a relative week/day from the end of year/week when negative). 
They should not be zero.

Для интервала

require 'date'

  def week_dates( week_num )
    year = Time.now.year
    week_start = Date.commercial( year, week_num, 1 )
    week_end = Date.commercial( year, week_num, 7 )
    week_start.strftime( "%m/%d/%y" ) + ' - ' + week_end.strftime("%m/%d/%y" )
  end

  puts week_dates(22)

EG: Вход (номер недели): 22

Выход: 06/12/08 - 06/19/08

кредит: Siep Korteling http://www.ruby-forum.com/topic/125140

Ответ 4

Date#cweek, похоже, получает номер недели ISO-8601 (неделя в понедельник), например %V в strftime (упомянутый @Robban в комментарии).

Например, в понедельник и в воскресенье недели я пишу это:

[ Date.new(2015, 7, 13), Date.new(2015, 7, 19) ].map { |date|
  date.strftime("U: %U - W: %W - V: %V - cweek: #{date.cweek}")
}

# => ["U: 28 - W: 28 - V: 29 - cweek: 29", "U: 29 - W: 28 - V: 29 - cweek: 29"]