2010-05-14 11 views
27

Ich habe einen Datumsbereich, den ich gerne rückwärts durchlaufen möchte. Geben Sie folgendes, wie würde ich dies erreichen, der Standard Range Operator scheint nicht richtig zu funktionieren.Wie durchlaufe ich einen Datumsbereich rückwärts?

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

wie Sie sehen können, arbeitet der Bereich Bediener richtig zu Ende beginnen bilden, aber nicht von einem Ende zu starten.

Antwort

58

Versuchen bis zu/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-01 
2010-03-02 
2010-03-03 
2010-03-04 
2010-03-05 
2010-03-06 
2010-03-07 
2010-03-08 
2010-03-09 
2010-03-10 
2010-03-11 
2010-03-12 
2010-03-13 
2010-03-14 
2010-03-15 
=> #<Date: 4910513/2,0,2299161> 
irb(main):006:0> ed.downto(sd) { |date| puts date } 
2010-03-15 
2010-03-14 
2010-03-13 
2010-03-12 
2010-03-11 
2010-03-10 
2010-03-09 
2010-03-08 
2010-03-07 
2010-03-06 
2010-03-05 
2010-03-04 
2010-03-03 
2010-03-02 
2010-03-01 
=> #<Date: 4910541/2,0,2299161> 
+0

Wenn Sie faul sind, können Sie auch einfach .collect.reverse, die unter den meisten Bedingungen genauso gut funktioniert. – tadman

+1

mit der Ausnahme, dass dann zuerst das gesamte Array erstellt und dann umgekehrt werden muss. upto und downto sind Enumeratoren. –

5

ich in der Regel nur die resultierende Anordnung umgekehrt:

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] 

Ich denke, es das Richtige zu machen tun, wenn Sie, wenn der Start nicht wissen, Datum wird vor oder nach dem Enddatum sein, möchten Sie etwas in der Form von:

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

die geben wird y oder das richtige Ding, entweder:

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] 
Verwandte Themen