1

私は自分の問題を検索し、多くの解決策を得ましたが、残念ながら私のニーズを満たすものはありませんでした.

私の問題は、2 つ以上の文字列があり、それらの文字列を時間に変換して追加したいということです。

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

出力は次のようになります: 43 分 13 秒

私の試みた解決策は次のとおりです。

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 

それでは進めません。

4

4 に答える 4

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

2 つの数値を文字列として抽出するメソッドtime_str = "10min 43s",を適用します。String@scan

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

Array#map次に、これら2つの文字列を整数に変換するために使用されます

["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]

配列は、変数and[10, 43]によって返され、受信 (分解) されます。minsec

min, sec = get_mins_and_secs(time_str)

残りは簡単です。

于 2013-11-01T19:36:16.103 に答える
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)
于 2013-11-01T19:05:12.987 に答える
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"
于 2013-11-01T18:57:47.350 に答える
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"
于 2013-11-04T14:05:43.760 に答える