2009-03-18 38 views

Trả lời

11

Đăng một câu trả lời thứ 2, như mãn tính (mà câu trả lời ban đầu của tôi đề nghị) không cung cấp cho bạn timespans nhưng timestamps.

Đây là công cụ phân tích cú pháp của tôi.

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 

Chiến lược khá đơn giản. Tách "5h" thành ["5", "h"], xác định số giây "h" đại diện cho (TOKENS) và thêm số tiền đó vào @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 

Nó không quá khó để làm cho nó xử lý "1.5h" hoặc là nhìn thấy codebase đơn giản như vậy.

+1

[Thời gian mãn tính] (https://github.com/hpoydar/chronic_duration) thực hiện điều này nhưng linh hoạt hơn và được kiểm tra tốt. – sj26

1

Phân tích cú pháp thành nội dung gì?

này sẽ phân tích thành một Hash:

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

Xin lỗi. không quen thuộc với JIRA ....

7

Bạn có thể sử dụng chronic. Nó có thể phân tích khá nhiều thứ mà bạn truy nguyên, bao gồm cả "ngày hôm qua", "tuần trước", v.v.

Cập nhật: Như OP chỉ ra trong ngày, không phải là thời gian. Xem câu trả lời khác của tôi.

3

tôi đã viết phương pháp này mà hiện nó khá tốt

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 
Các vấn đề liên quan