Iterate every month with date objects

后端 未结 9 2171
轻奢々
轻奢々 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:42

    As a helper method:

    def iterate(d1, d2)
      date = d1
      while date <= d2
        yield date
        date = date >> 1
      end
    end
    

    Usage:

    start_date = Date.new(2008, 12)
    end_date = Date.new(2009, 3)
    iterate(start_date, end_date){|date| puts date}
    

    Or, if you prefer to monkey patch Date:

    class Date
      def upto(end_date)
        date = self
        while date <= end_date
          yield date
          date = date >> 1
        end
      end
    end
    

    Usage:

    start_date = Date.new(2008, 12)
    end_date = Date.new(2009, 3)
    start_date.upto(end_date){|date| puts date}
    

提交回复
热议问题