Is it possible to create a list of months between two dates in Rails

后端 未结 4 436
情书的邮戳
情书的邮戳 2020-12-31 13:38

I am trying to create a page to display a list of links for each month, grouped into years. The months need to be between two dates, Today, and The date of the first entry.<

相关标签:
4条回答
  • 2020-12-31 13:50

    Use the date_helper gem which adds the months_between method to the Date class similar to Steve's answer.

    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]
    
    0 讨论(0)
  • 2020-12-31 13:53

    The following code will add a months_between instance method to the Date class

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

    This is VERY lightly tested, however it returns an Array of dates each date being the 1st day in each affected month.

    0 讨论(0)
  • 2020-12-31 13:57

    Just put what you want inside a range loop and use the Date::MONTHNAMES array like so

    (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 讨论(0)
  • 2020-12-31 14:09

    I don't know if I've completely understood your problem, but some of the following might be useful. I've taken advantage of the extensions to Date provided in 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}
    

    The final line uses another handy extension: Array#group_by, which does pretty much exactly what it promises.

    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
    

    I don't know if the start/end points are as desired, but you should be able to figure out what else you might need.

    HTH

    0 讨论(0)
提交回复
热议问题