Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在ruby中解析天/小时/分/秒?_Ruby_Parsing_Time_Rubygems - Fatal编程技术网

如何在ruby中解析天/小时/分/秒?

如何在ruby中解析天/小时/分/秒?,ruby,parsing,time,rubygems,Ruby,Parsing,Time,Rubygems,是否有一个gem或什么东西可以解析字符串,比如“4h 30m”“1d 4h”--有点像JIRA或task planners中的估计值,可能是国际化?解析成什么 这将解析为哈希: "4h 30m".split(/\s/).each{|i| h[i.gsub(/\d+/,"")] = i.gsub(/\w/,"")} 对不起。不熟悉JIRA…您可以使用。它可以解析几乎所有你尝试过的东西,包括“昨天”、“上周”等等 更新:正如OP在评论中指出的,慢性是指日期,而不是时间跨度。看看我的另一个答案。我写

是否有一个gem或什么东西可以解析字符串,比如“4h 30m”“1d 4h”--有点像JIRA或task planners中的估计值,可能是国际化?

解析成什么

这将解析为哈希:

"4h 30m".split(/\s/).each{|i| h[i.gsub(/\d+/,"")] = i.gsub(/\w/,"")}
对不起。不熟悉JIRA…

您可以使用。它可以解析几乎所有你尝试过的东西,包括“昨天”、“上周”等等


更新:正如OP在评论中指出的,慢性是指日期,而不是时间跨度。看看我的另一个答案。

我写的这个方法做得很好

  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

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

这是我对解析器的看法

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”
表示的秒数(
令牌
),并将该数量添加到
@时间

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”
也不会太难,因为代码库很简单。

做到了这一点。

做到了这一点,但更通用,也经过了很好的测试。