2013-11-01 38 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, '%M') 輸出:星期六,2013年11月2日00:10:00 0000 TIME2 = 「30年代32分鐘」 D2 = DateTime.strptime(TIME2, '%M') 輸出:星期六,2013年11月2日00:32:00 +0000 然後我不能進步then.Any idea? 謝謝@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] 

通過鏈接mapscan我們獲得

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

陣列[10, 43]由變量minsec返回和接收(解構):

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"