Публикация 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"
, учитывая, что кодовая база так же проста, как и она.