2009-03-18 4 views

Répondre

11

Publier une 2ème réponse, comme chronique (que ma réponse originale suggéré) ne vous donne pas, mais horodatages plages temporelles.

Voici mon parti sur un analyseur.

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 stratégie est assez simple. Diviser "5h" en ["5", "h"], définir combien de secondes "h" représente (TOKENS) et ajouter cette quantité à @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 

Il ne devrait pas être trop difficile ce qui en fait gérer "1.5h" non plus, voir le code de base est aussi simple que.

+1

[Durée chronique] (https://github.com/hpoydar/chronic_duration) le fait mais est plus polyvalent et bien testé. – sj26

1

Analyser quoi?

Cela va analyser dans un Hash:

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

Désolé. pas familiarisé avec JIRA ....

7

Vous pouvez utiliser chronic. Il peut analyser à peu près tout ce que vous y faites, y compris "hier", "la semaine dernière" etc.

Mise à jour: Comme l'OP le signale dans le commentaire, Chronic est pour les dates, pas pour les timespans. Voir mon autre réponse.

3

j'ai écrit cette méthode qui fait assez 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 
Questions connexes