如何在ruby中解析天/小时/分钟/秒?
是否有一个gem或其他东西来解析像“4h 30m”“1d 4h”这样的字符串 – 有点像JIRA或任务规划人员的估计,也许是国际化?
发布第二个答案,作为慢性(我的原始答案建议)不会给你时间戳而是时间戳。
这是我的解析器。
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"
,看到代码库就像它一样简单。
你可以使用慢性病 。 它几乎可以解析你所做的一切,包括“昨天”,“上周”等。
更新:正如OP在评论中指出的那样,Chronic是针对日期而不是时间跨度。 看到我的其他答案。
chronic_duration
这样做的。
我写了这个方法做得很好
def parse_duration(dur) duration = 0 number_tokens = dur.gsub(/[az]/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
虽然解析了什么?
这将解析成哈希:
"4h 30m".split(/\s/).each{|i| h[i.gsub(/\d+/,"")] = i.gsub(/\w/,"")}
抱歉。 不熟悉JIRA ….