2013-11-01 1 views
1

Я искал свою проблему и получил множество решений, но, к сожалению, никто не удовлетворяет мою потребность.Как преобразовать строку в объект Time?

Моя проблема, у меня есть два или более строк, и я хочу, чтобы преобразовать эти строки в раз, и добавить их:

time1 = "10min 43s" 
time2 = "32min 30s" 

Выход будет: 43min 13s

Моя попытка решения это:

time1 = "10min 43s" 
d1=DateTime.strptime(time1, '%M ') 
# Sat, 02 Nov 2013 00:10:00 +0000 
time2 = "32min 30s" 
d2=DateTime.strptime(time2, '%M ') 
# Sat, 02 Nov 2013 00:32:00 +0000 

Тогда я не могу прогрессировать.

+1

Если что выход быть «43min 13s»? –

+1

Какие у вас есть решения и почему они вас не удовлетворяют? «Вопросы, требующие кода, должны демонстрировать минимальное понимание решаемой проблемы. Включите попытки решения, почему они не работают и ожидаемые результаты». –

+0

Моя попытка: time1 = "10min 43s" d1 = DateTime.strptime (time1, '% М') выход: Сб, 2 ноября 2013 00:10:00 +0000 TIME2 = "32min 30s" d2 = DateTime.strptime (time2, '% М') выход: Сб , 02 ноя 2013 00:32:00 +0000 тогда я не могу продвигаться тогда. Любая идея? Спасибо @SergioTulentsev. – monsur

ответ

2

Есть много способов сделать это. Вот еще один:

time1 = "10min 43s" 
time2 = "32min 30s" 

def get_mins_and_secs(time_str) 
    time_str.scan(/\d+/).map(&:to_i) 
    #=> [10, 43] for time_str = time1, [32, 30] for time_str = time2 
end 

min, sec = get_mins_and_secs(time1) 
min2, sec2 = get_mins_and_secs(time2) 
min += min2 
sec += sec2 

if sec > 59 
    min += 1 
    sec -= 60 
end 

puts "#{min}min #{sec}sec" 

Давайте рассмотрим, что здесь происходит. Во-первых, вам нужно извлечь минуты и секунды из строк времени. Я сделал способ сделать это:

def get_mins_and_secs(time_str) 
    time_str.scan(/\d+/).map(&:to_i) 
    #=> [10, 43] for time_str = time1, [32, 30] for time_str = time2 
end 

Для time_str = "10min 43s", мы применяем метод [email protected], чтобы извлечь два числа как строки:

"10min 43s".scan(/\d+/) # => ["10", "43"] 

Array#map затем используется для преобразования этих двух строк в целые числа

["10", "43"].map {|e| e.to_i} # => [10, 43] 

Это можно записать более кратко, как

["10", "43"].map(&:to_i} # => [10, 43] 

приковав map к к scan получаем

"10min 43s".scan(/\d+/).map(&:to_i} # => [10, 43] 

Массив [10, 43] возвращается и получил (деконструкции) переменными min и sec:

min, sec = get_mins_and_secs(time_str) 

Остальное просто.

+0

thnaks @carysowland. Вы экономите свой день man.great – monsur

1

Вот простое решение, при условии, что формат остается прежним:

time1 = "10min 43s" 
time2 = "32min 30s" 
strings = [time1, time2] 

total_time = strings.inject(0) do |sum, entry| 
    minutes, seconds = entry.split(' ') 
    minutes = minutes.gsub("min", "").to_i.send(:minutes) 
    seconds = seconds.gsub("s", "").to_i.send(:seconds) 
    sum + minutes + seconds 
end 
puts "#{total_time/60}min #{total_time%60}s" 
1

Что-то вроде следующего должен сделать трюк:

# split the string on all the integers in the string 
def to_seconds(time_string) 
    min, sec = time_string.gsub(/\d+/).map(&:to_i) 

    min.minutes + sec.seconds 
end 

# Divide the seconds with 60 to get minutes and format the output. 
def to_time_str(seconds) 
    minutes = seconds/60 
    seconds = seconds % 60 

format("%02dmin %02dsec", minutes, seconds) 
end 

time_in_seconds1 = to_seconds("10min 43s") 
time_in_seconds2 = to_seconds("32min 30s") 

to_time_str(time_in_seconds1 + time_in_seconds2) 
0

Мое решение, которое принимает любое количество строк времени и вернуть сумму в том же формате:

def add_times(*times) 
    digits = /\d+/ 
    total_time = times.inject(0){|sum, entry| 
    m, s = entry.scan(digits).map(&:to_i) 
    sum + m*60 + s 
    }.divmod(60) 
    times.first.gsub(digits){total_time.shift} 
end 

p add_times("10min 43s", "32min 55s", "1min 2s") #=> "44min, 40s" 
p add_times("10:43", "32:55") #=> "38:43" 
Смежные вопросы