2013-02-04 15 views
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 

これは私の現在のコードですが、私はそれが嫌いです。見た目が乱雑です。それはすべてで偉大に見えるだけではありません。多分、ルビーの専門家が、連鎖によってこれを行う方法を教えて、誰かを減らして見栄えを良くする人がいるでしょうか?3行のコードの下でRubyで文字列形式のミリ秒をHH:MM:SS形式に変換するにはどうすればよいですか?

答えて

8

時間ですクラスRubyは、を提供しています秒から時間を取得する機能。これを使用して治療する。

miliseconds = 32290928 
seconds = miliseconds/1000 


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

OR UTC時間を取得するためには、

#Get UTC Time 
Time.at(seconds).utc.strftime("%H:%M:%S") 
+0

ありがとう、これはLOCの最短量です。 – qwexar

+0

@qwexar 'at 'の問題は' 1970年代から数えてミリ秒を与える必要があります。 'Time.at(0)#=> Thu Jan 01 05:30:00 +0530 1970'。そして 'at '関数は' mili-seconds'に相当する 'HH:MM:SS'を与えません。それは 'Time.at(0)'との相対的な結果をハイブにします。 – codeit

+0

@Tooroor Changaizそれは 'Time.at(0)'に相対的な時間を与えます。 – codeit

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" 
+0

あなたは、アレイ内の秩序を混同していますか?私は '[時間、分、秒]を期待していただろう。 – kronn

3
@マイクウッドハウスで与え

ニースソリューション:

使用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 

回答がhow to convert 270921sec into days + hours + minutes + sec ? (ruby)

+0

うわー、非常にエレガント –

関連する問題