Нахождение даты для данного номера недели - PullRequest
7 голосов
/ 06 марта 2012

Я пытаюсь сделать какую-то дату математику на основе номера недели данного года. Например:

date = Date.today # Monday, March 5, 2012
puts date.cwyear  # 2012
puts date.cweek   # 10 (10th week of 2012)

Теперь, когда я знаю, что такое текущая неделя, я хочу выяснить, что такое следующая неделя и предыдущая неделя. Мне нужно взять год (2012) и номер недели (10) и превратить его обратно в объект даты, чтобы я мог рассчитать значение для следующей / предыдущей недели. Как я могу это сделать?

Ответы [ 5 ]

15 голосов
/ 06 марта 2012

Вы хотите Date.commercial:

require 'date'
now = Date.today                                           #=> 2012-03-05
monday_next_week = Date.commercial(now.cwyear,now.cweek+1) #=> 2012-03-12
next_sunday_or_today = monday_next_week - 1                #=> 2012-03-11

Обратите внимание, что недели начинаются в понедельник, поэтому, если вы находитесь в воскресенье и попросите следующий понедельник - 1, вы получитетот же день.

Обратите внимание, что если вы не хотите понедельники, вы также можете указать номер дня в методе:

thursday_next_week = Date.commercial(now.cwyear,now.cweek+1,4) #=> 2012-03-15
3 голосов
/ 06 марта 2012

Расчет по дням довольно прост с Date объектами. Если вы просто хотите получить предыдущую / следующую неделю от данного объекта Date, используйте следующее:

date = Date.today
previous_week = (date - 7).cweek
next_week = (date + 7).cweek
1 голос
/ 12 января 2015

Предполагая, что вы имеете в виду «номер данной недели в текущем году», вы можете сделать следующее:

2.weeks.since(Time.gm(Time.now.year))
=> Fri Jan 15 00:00:00 UTC 2010

Заменить (week_number - 1) на 1 в приведенном выше, и вы получитедата на желаемой неделе.

1 голос
/ 06 марта 2012

В ActiveSupport у вас есть помощник для преобразования Fixnum во время http://as.rubyonrails.org/classes/ActiveSupport/CoreExtensions/Numeric/Time.html использование:

date = Date.today
week_ago = date - 1.week
next_week = date + 1.week
0 голосов
/ 31 марта 2016

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

def self.get_week(date)
    year = date.year
    first_monday_of_the_year = self.get_first_monday_of_the_year(year)
    # The first days of January may belong to the previous year!
    if date < first_monday_of_the_year
      year -= 1
      first_monday_of_the_year = self.get_first_monday_of_the_year(year)
    end
    day_difference = date - first_monday_of_the_year
    week = (day_difference / 7).to_i + 1
    week
  end

   def self.get_monday_of_year_week(year, week)
    d = self.get_first_monday_of_the_year(year)
    d + ((week - 1) * 7).days
  end

  def self.get_first_monday_of_the_year(year)
    d = Date.new(year, 1, 7)  # 7 Jan is always in the first week
    self.get_monday_of_week(d)
  end

  def self.get_monday_of_week(date)
    wday = (date.wday + 6) % 7
    date - wday.days
  end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...