2012-03-05 2 views
7

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

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

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

+0

Является ли это в Rails/Вы можете использовать ActiveSupport? Он предоставляет некоторые хорошие помощники даты для таких вещей. Кроме того, по «следующей и предыдущей неделе» вы имеете в виду ровно через семь дней после и до «даты» или начала этих недель? –

+0

это приложение Sinatra, но если ActiveSupport предоставляет функции, которые могут это сделать, и я могу использовать его с приложением Sinatra, я бы хотел его использовать. – Andrew

ответ

14

Вы хотите 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 
+0

Удивительный! Спасибо! – Andrew

+0

@Andrew [Добро пожаловать] (http://meta.stackexchange.com/a/5235/153741) :) – Phrogz

+3

это не работает в течение 53 недель – Thorin

3

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

date = Date.today 
previous_week = (date - 7).cweek 
next_week = (date + 7).cweek 
+1

+1 Никогда не понимал те ActiveSupport cheapo's. – steenslag

+0

Это выглядит многообещающе. Теперь, как бы я инициализировал новый объект даты с данной недели и года (т. Е. Не на этой неделе)? – Andrew

+0

@steenslag Это просто то, что вы часто привыкаете к тому, чтобы иметь (особенно, если большая часть вашей работы с Ruby (Date) происходит с Rails). Не слишком отличается от того, что используется для «инъекции» в Ruby, а затем для перехода на Java, и вы должны написать все это самостоятельно - это просто еще одна общая библиотека. Я все для использования ядра Ruby до зависимости, но если у вас уже есть ActiveSupport, почему бы не использовать его? –

1

В 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

Это выглядит многообещающе. Теперь, как бы я инициализировал новый объект даты с данной недели и года (т. Е. Не на этой неделе)? – Andrew

0

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

2.weeks.since (Time.gm (Time.now.year)) => Пт 15 января 00:00:00 UTC 2010 Замены (week_number - 1) для 1 в выше, и вы получите дату на желаемой неделе.

0

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

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 
Смежные вопросы