2009-05-29 5 views
9

Я пытаюсь создать страницу для отображения списка ссылок за каждый месяц, сгруппированных по годам. Месяцы должны быть между двумя датами: «Сегодня» и «дата первой записи».Возможно ли создать список месяцев между двумя датами в Rails

Я на кирпичной стене, я понятия не имею, как это создать.

Любая помощь будет массово appriciated

С уважением Адам

ответ

32

Просто положить то, что вы хотите внутри цикла диапазон и использовать Date :: MONTHNAMES массив как так

(date.year..laterdate.year).each do |y| 
    mo_start = (date.year == y) ? date.month : 1 
    mo_end = (laterdate.year == y) ? laterdate.month : 12 

    (mo_start..mo_end).each do |m| 
     puts Date::MONTHNAMES[m] 
    end 
end 
+0

нужно добавить внешний цикл в течение многих лет – marcumka

+0

Да я только заметил, что, отредактировано должны работать сейчас – ErsatzRyan

+0

+1 Nice, но должно быть изменено, чтобы показать год, в соответствии с первоначальным требованием –

2

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

d1 = Date.parse("20070617") # => Sun, 17 Jun 2007 
d2 = Date.parse("20090529") #=> Fri, 29 May 2009 
eom = d1.end_of_month #=> Sat, 30 Jun 2007 
mth_ends = [eom] #=> [Sat, 30 Jun 2007] 
while eom < d2 
    eom = eom.advance(:days => 1).end_of_month 
    mth_ends << eom 
end 
yrs = mth_ends.group_by{|me| me.year} 

В последней строке используется другой удобным расширение: Array # group_by, который делает в значительной степени именно то, что она обещает.

d1.year.upto(d2.year) do |yr| 
    puts "#{yrs[yr].min}, #{yrs[yr].max}" 
end 
2007-06-30, 2007-12-31 
2008-01-31, 2008-12-31 
2009-01-31, 2009-05-31 

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

НТН

5

Следующий код будет добавить метод в MONTHS_BETWEEN инстанс класса Date

#!/usr/bin/ruby 

require 'date' 

class Date 

    def self.months_between(d1, d2) 
    months = [] 
    start_date = Date.civil(d1.year, d1.month, 1) 
    end_date = Date.civil(d2.year, d2.month, 1) 

    raise ArgumentError unless d1 <= d2 

    while (start_date < end_date) 
     months << start_date 
     start_date = start_date >>1 
    end 

    months << end_date 

    end 
end 

Это очень легко испытанной, однако он возвращает массив дат каждую дату, являющуюся 1-й день в каждом месяц.

0

Используйте date_helper драгоценный камень, который добавляет метод months_between к Date класса аналогично ответу Стива.

xmas = Date.parse("2013-12-25") 
hksar_establishment_day = Date.parse("2014-07-01") 

Date.months_between(xmas,hksar_establishment_day) 
=> [Sun, 01 Dec 2013, Wed, 01 Jan 2014, Sat, 01 Feb 2014, Sat, 01 Mar 2014, Tue, 01 Apr 2014, Thu, 01 May 2014, Sun, 01 Jun 2014, Tue, 01 Jul 2014] 
Смежные вопросы