2013-11-01 22 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"