5
@scores_raw.each do |score_raw|
  # below is code if time was being sent in milliseconds
  hh = ((score_raw.score.to_i)/100)/3600
  mm = (hh-hh.to_i)*60
  ss = (mm-mm.to_i)*60
  crumbs = [hh,mm,ss]
  sum = crumbs.first.to_i*3600+crumbs[1].to_i*60+crumbs.last.to_i
  @scores << {:secs => sum, :hms => hh.round.to_s+":"+mm.round.to_s+":"+ss.round.to_s}
  @scores_hash << {:secs => sum, :hms => hh.round.to_s+":"+mm.round.to_s+":"+ss.round.to_s}
  # milliseconds case end
end

それは私の現在のコードですが、私はそれを嫌います。散らかっています。見栄えが良いだけではありません。たぶん、ルビーの専門家が収集を連鎖させたり、減らしたり、見栄えを良くしたりすることでこれを行う方法を教えてくれる人はいますか?

4

3 に答える 3

8

Ruby が提供する Time クラスはat、秒から時間を取得する機能を提供します。これを使えば治ります。

miliseconds = 32290928
seconds = miliseconds/1000


Time.at(seconds).strftime("%H:%M:%S")

または、utc 時刻を取得する

#Get UTC Time
Time.at(seconds).utc.strftime("%H:%M:%S")
于 2013-02-04T15:34:07.237 に答える
5

これをヘルパー メソッドでラップできます。

def format_milisecs(m)
  secs, milisecs = m.divmod(1000) # divmod returns [quotient, modulus]
  mins, secs = secs.divmod(60)
  hours, mins = mins.divmod(60)

  [secs,mins,hours].map { |e| e.to_s.rjust(2,'0') }.join ':'
end

format_milisecs 10_600_00
=> "03:13:20"
于 2013-02-04T12:54:19.583 に答える
3

@Mike Woodhouseによって与えられた素敵な解決策:

使用divmod:

t = 270921000
ss, ms = t.divmod(1000)          #=> [270921, 0]
mm, ss = ss.divmod(60)           #=> [4515, 21] 
hh, mm = mm.divmod(60)           #=> [75, 15]
dd, hh = hh.divmod(24)           #=> [3, 3]
puts "%d days, %d hours, %d minutes and %d seconds" % [dd, hh, mm, ss]
#=> 3 days, 3 hours, 15 minutes and 21 seconds

答えは 、270921sec を日 + 時間 + 分 + 秒に変換する方法です。(ルビー)

于 2013-02-04T12:54:59.040 に答える