【问题标题】:How to parse days/hours/minutes/seconds in ruby?如何在 ruby​​ 中解析天/小时/分钟/秒?
【发布时间】:2010-10-14 00:38:04
【问题描述】:

是否有 gem 或其他东西可以解析诸如“4h 30m”“1d 4h”之类的字符串 - 有点像 JIRA 或任务规划器中的估计值,也许是国际化的?

【问题讨论】:

    标签: ruby parsing time rubygems


    【解决方案1】:

    chronic_duration 会这样做。

    【讨论】:

      【解决方案2】:

      发布第二个答案,因为慢性(我原来的答案建议)不会给你时间跨度,而是时间戳。

      这是我的解析器。

      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" 也不应该太难,代码库就是这么简单。

      【讨论】:

      【解决方案3】:

      您可以使用chronic。它几乎可以解析您所掌握的所有内容,包括“昨天”、“上周”等。

      更新:正如 OP 在评论中指出的那样,Chronic 是针对日期,而不是时间跨度。请参阅我的其他答案。

      【讨论】:

        【解决方案4】:

        我写的这个方法做得很好

          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
        

        【讨论】:

          【解决方案5】:

          解析成什么?

          这将解析成一个哈希:

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

          对不起。不熟悉 JIRA....

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-01-06
            • 2017-05-10
            相关资源
            最近更新 更多