是否可以在Rails中创建两个日期之间的月份列表

我正在尝试创建一个页面来显示每个月的链接列表,分组为年。 月份需要在两个日期之间,今天和第一个条目的日期。

我在砖墙,我不知道如何创建这个。

任何帮助都会受到大量关注

问候亚当

只需将您想要的内容放在一个范围循环中,然后使用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 

以下代码将在Month类中添加months_between实例方法

 #!/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 

这是非常轻微的测试,但它返回一个日期数组,每个日期是每个受影响月份的第一天。

我不知道我是否完全理解了您的问题,但以下某些内容可能会有用。 我利用了ActiveSupport中提供的Date扩展:

 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 

我不知道开始/结束点是否符合要求,但您应该能够找出您可能需要的其他内容。

HTH

使用date_helper gem将months_between方法添加到Date类,类似于Steve的答案。

 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]