Можно ли создать список месяцев между двумя датами в Rails - PullRequest
10 голосов
/ 29 мая 2009

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

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

Любая помощь будет в огромной степени оценена

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

Ответы [ 4 ]

34 голосов
/ 29 мая 2009

Просто поместите то, что вы хотите, в цикл диапазона и используйте массив 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
6 голосов
/ 29 мая 2009

Следующий код добавит метод экземпляра month_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-м днем ​​в каждом затронутом месяце.

2 голосов
/ 29 мая 2009

Не знаю, полностью ли я понял вашу проблему, но некоторые из следующих могут быть полезны. Я воспользовался расширениями на дату, предоставленными в 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

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

НТН

0 голосов
/ 26 апреля 2014

Используйте гем 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]
...