2009-03-18 17 views

risposta

11

Inviare una seconda risposta, come cronica (che la mia risposta originale suggerito) non ti dà timespans ma timestamp.

Ecco il mio passaggio su un parser.

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 

La strategia è abbastanza semplice. Dividere "5h" in ["5", "h"], definire quanti secondi "h" rappresenta (TOKENS) e aggiungere tale importo a @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 

Non dovrebbe essere troppo difficile fare maneggia "1.5h" sia, vedendo il codice di base è semplice come è.

+1

[durata cronica] (https://github.com/hpoydar/chronic_duration) lo fa ma è più versatile e ben testato. – sj26

1

Parse in cosa?

Questo analizzerà in un hash:

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

spiacenti. non ha familiarità con JIRA ....

7

È possibile utilizzare chronic. È in grado di analizzare praticamente tutto ciò che viene visualizzato, tra cui "ieri", "la scorsa settimana" ecc.

Aggiornamento: Come l'OP indica nel commento, Chronic è per le date, non i tempi. Vedi la mia altra risposta.

3

ho scritto questo metodo che lo fa piuttosto bene

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