2009-02-01 13 views
30

रूटर में टाइम रेंज पर फिर से शुरू करने का कोई तरीका है, और डेल्टा सेट करें?रूल्टा टाइम ऑब्जेक्ट पर डेल्टा

यहाँ मैं करना चाहते हैं क्या की एक विचार है:

for hour in (start_time..end_time, hour) 
    hour #=> Time object set to hour 
end 

आप समय वस्तुओं से अधिक पुनरावृति कर सकते हैं, लेकिन यह दोनों के बीच हर दूसरे देता है। मुझे वास्तव में क्या चाहिए ऑफसेट या डेल्टा सेट करने का एक तरीका है (जैसे मिनट, घंटा इत्यादि)

क्या यह रूबी में बनाया गया है, या क्या कोई सभ्य प्लगइन उपलब्ध है?

उत्तर

55

1.9 से पहले, आप Range#step इस्तेमाल कर सकते हैं:

(start_time..end_time).step(3600) do |hour| 
    # ... 
end 

हालांकि, इस रणनीति काफी धीमी है, क्योंकि यह Time#succ 3600 बार कॉल करेगा। आप 1.hour, जो काफी अधिक पठनीय है के साथ 3600 की जगह ले सकता आप रेल उपयोग कर रहे हैं

hour = start_time 
while hour < end_time 
    # ... 
    hour += 3600 
end 

: इसके बजाय, रूप his answer में dolzenko से कहा, एक अधिक कुशल समाधान एक सरल पाश उपयोग करने के लिए है।

+4

श्रेणी # चरण रूबी 1.9.2p180 और 1.9.3 में समय वस्तुओं के लिए काम नहीं करता है। यह कहता है: TypeError: समय से पुन: सक्रिय नहीं हो सकता है। – prekageo

+0

@prekageo धन्यवाद, अपडेट किया गया। –

+1

'समय' चरणों के लिए 'रेंज' की 'चरण' विधि तक सीमित होना आसान है। मैंने चरण 2. गतिशील अंतराल जैसे '2.months + 33.seconds' (_if_ आप 'ActiveSupport' का उपयोग कर रहे हैं) का उत्तर लिखा है। Http://stackoverflow.com/questions/19093487/ruby-create-range-of-dates/19094504#19094504 देखें। आंतरिक रूप से, प्रॉक्सी विधि इस जबकि-लूप दृष्टिकोण का उपयोग करती है। स्वीकृत उत्तर की तुलना में – captainpete

36

अपने start_time और end_time तो वास्तव में Time वर्ग तो Range#step का उपयोग कर अत्यंत अक्षम किया जाएगा, क्योंकि यह Time#succ के साथ इस श्रृंखला में हर दूसरे से अधिक पुनरावृति होगी साथ समाधान के उदाहरण हैं। आप पूर्णांक के लिए अपने बार में परिवर्तित तो सरल इसके अलावा में इस्तेमाल किया जाएगा, लेकिन इस तरह से आप की तरह कुछ के साथ खत्म हो जाएगा:

(start_time.to_i..end_time.to_i).step(3600) do |hour| 
    hour = Time.at(hour)  
    # ... 
end 

लेकिन यह भी साथ किया जा सकता से सरल और अधिक कुशल (यानी सभी प्रकार रूपांतरण के बिना) लूप:

hour = start_time 
begin 
    # ...  
end while (hour += 3600) < end_time 
+5

अधिक बेहतर प्रदर्शन समाधान। – dylanfm

+1

@dylanfm वास्तव में। चूंकि ऐसा लगता है कि ओपी इस पर स्वीकृत उत्तर बदलने जा रहा है, इसलिए मैंने इसे शामिल करने के लिए अपना जवाब अपडेट कर दिया है। –

16

रेंज # चरण विधि इस मामले में बहुत धीमी है। शुरुआत करें .. जबकि, dolzenko यहां पोस्ट किया गया।

def time_iterate(start_time, end_time, step, &block) 
    begin 
     yield(start_time) 
    end while (start_time += step) <= end_time 
    end 

तो,

start_time = Time.parse("2010/1/1") 
end_time = Time.parse("2010/1/31") 
time_iterate(start_time, end_time, 1.hour) do |t| 
    puts t 
end 
रेल में

यदि:

आप एक नई विधि को परिभाषित कर सकते हैं।

संबंधित मुद्दे