6

TL;DR:HH:MM:SS.msHH:MM:SS.msasの違いを取得する必要がありますHH:MM:SS:ms


必要なもの:

ここにトリッキーなものがあります。次のような 2 つのタイムスタンプの差を計算しようとしています。

In: 00:00:10.520
Out: 00:00:23.720

配信する必要があります:

Diff: 00:00:13.200

Time時間を実際のオブジェクトに解析し、そこでの違いを使用すると思いました。これは前のケースでうまく機能し、 を返します00:0:13.200

機能しないもの:

usecただし、Ruby が代わりに を使用するため、これが正しく機能しない場合もありmsecます。

In: 00:2:22.760
Out: 00:2:31.520
Diff: 00:0:8.999760

明らかに、違いは であり00:00:8:760、 ではないはず00:00:8.999760です。私は本当にただtdiff.usec.to_s.gsub('999','')……


これまでの私のコード:

これまでのコードは次のとおりです(これらは「0:00:10:520」などの入力文字列から解析されます)。

tin_first, tin_second = ins.split(".")
tin_hours, tin_minutes, tin_seconds = tin_first.split(":")
tin_usec = tin_second * 1000
tin = Time.gm(0, 1, 1, tin_hours, tin_minutes, tin_seconds, tin_usec)

同じことが起こりtoutます。それで:

tdiff = Time.at(tout-tin)

出力には、次を使用します。

"00:#{tdiff.min}:#{tdiff.sec}.#{tdiff.usec}"

これを行うより速い方法はありますか?覚えておいてください、私は2つの時間の違いが欲しいだけです。私は何が欠けていますか?

現在、Ruby 1.9.3p6 を使用しています。

4

3 に答える 3

5

使用Time:

require 'time' # Needed for Time.parse

def time_diff(time1_str, time2_str)
  t = Time.at( Time.parse(time2_str) - Time.parse(time1_str) )
  (t - t.gmt_offset).strftime("%H:%M:%S.%L")
end

out_time = "00:00:24.240"
in_time  = "00:00:14.520"

p time_diff(in_time, out_time)
#=> "00:00:09.720"

に依存しないソリューションは次のTimeとおりです。

def slhck_diff( t1, t2 )
  ms_to_time( time_as_ms(t2) - time_as_ms(t1) )
end

# Converts "00:2:22.760" to 142760
def time_as_ms( time_str )
  re = /(\d+):(\d+):(\d+)(?:\.(\d+))?/
  parts = time_str.match(re).to_a.map(&:to_i)
  parts[4]+(parts[3]+(parts[2]+parts[1]*60)*60)*1000
end

# Converts 142760 to "00:02:22.760"
def ms_to_time(ms)
  m = ms.floor / 60000
  "%02i:%02i:%06.3f" % [ m/60, m%60, ms/1000.0 % 60 ]
end

t1 = "00:00:10.520"
t2 = "01:00:23.720"
p slhck_diff(t1,t2)
#=> "01:00:13.200"

t1 = "00:2:22.760"
t2 = "00:2:31.520"
p slhck_diff(t1,t2)
#=> "00:00:08.760"
于 2011-12-14T17:51:08.517 に答える
1

私は次のことがうまくいくと考えました:

out_time = "00:00:24.240"
in_time = "00:00:14.520"
diff = Time.parse(out_time) - Time.parse(in_time)
Time.at(diff).strftime("%H:%M:%S.%L")
# => "01:00:09.720"

それ01私が本当に理解していない時間のために印刷されます。

その間、私は以下を使用しました:

Time.at(diff).strftime("00:%M:%S.%L")
# => "00:00:09.720"

もちろん、これをより適切に行う回答は、賛成票または承認を得ます。

于 2011-12-14T17:11:02.753 に答える
0
in_time = "00:02:22.760"
out_time = "00:02:31.520"
diff = (Time.parse(out_time) - Time.parse(in_time))*1000
puts diff

出力:

8760.0 millliseconds

Time.parse(out_time) - Time.parse(in_time)に変換するsecondsために を掛けた結果を与えます。1000milliseconds

ここに画像の説明を入力

于 2011-12-14T16:12:03.913 に答える