2009-03-18 24 views

Respuesta

11

Añadir un segundo respuesta, como crónica (que mi respuesta original sugirió) no le da lapsos, pero las marcas de tiempo.

Aquí está mi ir en un analizador.

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 estrategia es bastante simple. Dividir "5h" en ["5", "h"], definir cuántos segundos representa "h" (TOKENS) y agregar esa cantidad 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 

No debería ser muy difícil por lo que es manejar "1.5h" o bien, al ver el código base es tan simple como es.

+1

[Duración crónica] (https://github.com/hpoydar/chronic_duration) hace esto pero es más versátil y bien probado. – sj26

1

¿Pero en qué?

Esta analizará en un Hash:

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

Lo sentimos. no está familiarizado con JIRA ....

7

Puede usar chronic. Puede analizar prácticamente todo lo que truele, incluso "ayer", "la semana pasada", etc.

Actualización: Como señala el OP en el comentario, Crónico es para fechas, no para intervalos de tiempo. Ver mi otra respuesta.

3

escribí este método que lo hace bastante bien

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 
Cuestiones relacionadas