"4h 30m" "1d 4h" のような文字列を解析する宝石や何かがありますか? JIRA やタスク プランナーの見積もりのようなもので、おそらく国際化されていますか?
5316 次
5 に答える
15
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"。コードベースがシンプルであることを確認してください。
于 2009-03-19T07:49:00.523 に答える
6
慢性的に使用できます。「昨日」、「先週」など、あなたがそれを使っているほとんどすべてを解析することができます。
更新:OPがコメントで指摘しているように、慢性は日付であり、期間ではありません。私の他の答えを参照してください。
于 2009-03-18T11:16:02.843 に答える
3
私はそれをかなりうまく行うこのメソッドを書きました
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
于 2009-03-18T11:20:44.907 に答える
1
しかし、何に解析しますか?
これはハッシュに解析されます:
"4h 30m".split(/\s/).each{|i| h[i.gsub(/\d+/,"")] = i.gsub(/\w/,"")}
ごめん。JIRAに慣れていない....
于 2009-03-18T08:34:35.443 に答える