How Do I Loop Through a Date Range in Reverse? How Do I Loop Through a Date Range in Reverse? ruby ruby

How Do I Loop Through a Date Range in Reverse?


Try upto/downto :

irb(main):003:0> sd = Date.parse('2010-03-01')=> #<Date: 4910513/2,0,2299161>irb(main):004:0> ed = Date.parse('2010-03-15')=> #<Date: 4910541/2,0,2299161>irb(main):005:0> sd.upto(ed) { |date| puts date }2010-03-012010-03-022010-03-032010-03-042010-03-052010-03-062010-03-072010-03-082010-03-092010-03-102010-03-112010-03-122010-03-132010-03-142010-03-15=> #<Date: 4910513/2,0,2299161>irb(main):006:0> ed.downto(sd) { |date| puts date }2010-03-152010-03-142010-03-132010-03-122010-03-112010-03-102010-03-092010-03-082010-03-072010-03-062010-03-052010-03-042010-03-032010-03-022010-03-01=> #<Date: 4910541/2,0,2299161>


I usually just reverse the resulting array:

ruby-1.8.7-p72 > sd = Date.parse('2010-03-01') => Mon, 01 Mar 2010 ruby-1.8.7-p72 > ed = Date.parse('2010-03-05') => Fri, 05 Mar 2010 ruby-1.8.7-p72 > (sd..ed).to_a => [Mon, 01 Mar 2010, Tue, 02 Mar 2010, Wed, 03 Mar 2010, Thu, 04 Mar 2010, Fri, 05 Mar 2010] ruby-1.8.7-p72 > (sd..ed).to_a.reverse => [Fri, 05 Mar 2010, Thu, 04 Mar 2010, Wed, 03 Mar 2010, Tue, 02 Mar 2010, Mon, 01 Mar 2010] 

I guess, to make it do the right thing when you don't know if the start date is going to be before or after the end date, you'd want something along the lines of:

def date_range(sd, ed)  sd < ed ? (sd..ed).to_a : (ed..sd).to_a.reverseend

which will give you the right thing either way:

ruby-1.8.7-p72 > sd = Date.parse('2010-03-01') => Mon, 01 Mar 2010 ruby-1.8.7-p72 > ed = Date.parse('2010-03-05') => Fri, 05 Mar 2010 ruby-1.8.7-p72 > date_range(sd, ed) => [Mon, 01 Mar 2010, Tue, 02 Mar 2010, Wed, 03 Mar 2010, Thu, 04 Mar 2010, Fri, 05 Mar 2010] ruby-1.8.7-p72 > date_range(ed, sd) => [Fri, 05 Mar 2010, Thu, 04 Mar 2010, Wed, 03 Mar 2010, Tue, 02 Mar 2010, Mon, 01 Mar 2010]