2009-03-18 14 views
9

क्या "4h 30m" "1d 4h" जैसे तारों को पार्स करने के लिए कोई मणि या कुछ है - जिरा या कार्य योजनाकारों के अनुमानों की तरह, अंतर्राष्ट्रीयकरण के साथ?रूबी में दिन/घंटे/मिनट/सेकेंड का विश्लेषण कैसे करें?

उत्तर

11

करता है पोस्ट कर रहा है एक 2 जवाब लिखा, पुरानी (जो अपने मूल जवाब सुझाव) आप timespans लेकिन टाइम स्टांप नहीं देता है के रूप में।

यहां एक पार्सर पर जाना है।

class TimeParser 
    TOKENS = { 
    "m" => (60), 
    "h" => (60 * 60), 
    "d" => (60 * 60 * 24) 
    } 

    attr_reader :time 

    def initialize(input) 
    @input = input 
    @time = 0 
    parse 
    end 

    def parse 
    @input.scan(/(\d+)(\w)/).each do |amount, measure| 
     @time += amount.to_i * TOKENS[measure] 
    end 
    end 
end 

रणनीति काफी सरल है। "5h"["5", "h"] में विभाजित करें, परिभाषित करें कि "h" कितने सेकंड (TOKENS) का प्रतिनिधित्व करता है, और उस राशि को @time पर जोड़ें।

TimeParser.new("1m").time 
# => 60 

TimeParser.new("1m wtf lol").time 
# => 60 

TimeParser.new("4h 30m").time 
# => 16200 

TimeParser.new("1d 4h").time 
# => 100800 

यह बहुत मुश्किल नहीं होना चाहिए यह या तो "1.5h" संभाल रही है, codebase देखकर यह है के रूप में सरल है।

+1

[क्रोनिक अवधि] (https://github.com/hpoydar/chronic_duration) यह करता है लेकिन यह अधिक बहुमुखी और अच्छी तरह से परीक्षण किया जाता है। – sj26

1

हालांकि इसमें क्या पार्स?

यह एक हैश में पार्स जाएगा:

"4h 30m".split(/\s/).each{|i| h[i.gsub(/\d+/,"")] = i.gsub(/\w/,"")} 

क्षमा करें। जिरा से परिचित नहीं ....

7

आप chronic का उपयोग कर सकते हैं। यह "कल", "पिछले सप्ताह" इत्यादि सहित बहुत अधिक सब कुछ पार्स कर सकता है।

अद्यतन: ओपी टिप्पणी में बताता है, क्रॉनिक तिथियों के लिए है, समय-समय पर नहीं। मेरा दूसरा जवाब देखें।

3

मैं इस पद्धति है कि यह बहुत अच्छी तरह से

def parse_duration(dur) 
    duration = 0 

    number_tokens = dur.gsub(/[a-z]/i,"").split 
    times = dur.gsub(/[\.0-9]/,"").split 

    if number_tokens.size != times.size 
     raise "unrecognised duration!" 
    else 
     dur_tokens = number_tokens.zip(times) 

     for d in dur_tokens 
     number_part = d[0].to_f 
     time_part = d[1] 

     case time_part.downcase 
     when "h","hour","hours" 
      duration += number_part.hours 
     when "m","minute","minutes","min","mins" 
      duration += number_part.minutes 
     when "d","day","days" 
      duration += number_part.days 
     when "w","week","weeks" 
      duration += number_part.weeks 
     when "month", "months" 
      duration += number_part.months 
     when "y", "year", "years" 
      duration += number_part.years 
     else 
      raise "unrecognised duration!" 
     end 

     end 

    end 

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