Iterate every month with date objects

后端 未结 9 2176
轻奢々
轻奢々 2021-02-01 05:47

So I have two ruby Date objects, and I want to iterate them every month. For example if I have Date.new(2008, 12) and Date.new(2009, 3), it would yield me 2008-12, 2009-1, 2009-

9条回答
  •  余生分开走
    2021-02-01 06:49

    I came up with the following solution. It's a mixin for date ranges that adds an iterator for both years and months. It yields sub-ranges of the complete range.

        require 'date'
    
        module EnumDateRange  
          def each_year
            years = []
            if block_given?    
              grouped_dates = self.group_by {|date| date.year}
              grouped_dates.each_value do |dates|
                years << (yield (dates[0]..dates[-1]))
              end
            else
              return self.enum_for(:each_year)
            end
            years
          end
    
          def each_month
            months = []
            if block_given?
              self.each_year do |range|
                grouped_dates = range.group_by {|date| date.month}
                grouped_dates.each_value do |dates|
                  months << (yield (dates[0]..dates[-1]))
                end
              end
            else
              return self.enum_for(:each_month)
            end
            months
          end  
        end
    
        first = Date.parse('2009-01-01')
        last = Date.parse('2011-01-01')
    
        complete_range = first...last
        complete_range.extend EnumDateRange
    
        complete_range.each_year {|year_range| puts "Year: #{year_range}"}
        complete_range.each_month {|month_range| puts "Month: #{month_range}"}
    

    Will give you:

    Year: 2009-01-01..2009-12-31
    Year: 2010-01-01..2010-12-31
    Month: 2009-01-01..2009-01-31
    Month: 2009-02-01..2009-02-28
    Month: 2009-03-01..2009-03-31
    Month: 2009-04-01..2009-04-30
    Month: 2009-05-01..2009-05-31
    Month: 2009-06-01..2009-06-30
    Month: 2009-07-01..2009-07-31
    Month: 2009-08-01..2009-08-31
    Month: 2009-09-01..2009-09-30
    Month: 2009-10-01..2009-10-31
    Month: 2009-11-01..2009-11-30
    Month: 2009-12-01..2009-12-31
    Month: 2010-01-01..2010-01-31
    Month: 2010-02-01..2010-02-28
    Month: 2010-03-01..2010-03-31
    Month: 2010-04-01..2010-04-30
    Month: 2010-05-01..2010-05-31
    Month: 2010-06-01..2010-06-30
    Month: 2010-07-01..2010-07-31
    Month: 2010-08-01..2010-08-31
    Month: 2010-09-01..2010-09-30
    Month: 2010-10-01..2010-10-31
    Month: 2010-11-01..2010-11-30
    Month: 2010-12-01..2010-12-31
    

提交回复
热议问题