2010-05-14 10 views
27

मेरे पास एक तिथि सीमा है जिसे मैं रिवर्स में लूप करने में सक्षम होना चाहता हूं। निम्नलिखित दें, मैं इसे कैसे पूरा करूंगा, मानक Range ऑपरेटर ठीक से काम नहीं कर रहा है।रिवर्स में डेट रेंज के माध्यम से मैं लूप कैसे करूं?

>> 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 
=> [] 

के रूप में आप देख सकते हैं, रेंज ऑपरेटर ठीक से समाप्त करने के लिए शुरू के रूप में काम करता है, लेकिन अंत से नहीं शुरू करने के लिए।

उत्तर

58

तक प्रयास करें/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

यदि आप आलसी हैं तो आप आसानी से भी उपयोग कर सकते हैं .collect.reverse जो अधिकांश परिस्थितियों में भी काम करता है। – tadman

+1

सिवाय इसके कि इसे पहले पूरी सरणी बनाना है, फिर इसे उलट दें। ऊपर और नीचे गणक हैं। –

5

मैं आम तौर पर सिर्फ परिणामी सरणी रिवर्स:,

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] 

मुझे लगता है कि जब आप अगर शुरू नहीं जानता कि यह सही काम करने के लिए तिथि समाप्ति तिथि से पहले या उसके बाद होने वाली है, आप कुछ के साथ कुछ चाहते हैं:

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

जो आपको देगा कहां सही चीज या तो रास्ता:

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]