##やりたいこと
注意:コメント指摘によるコードの改良も行っているので、ぜひ最後までみてください〜
8時間30分 + 10時間 + 10時間
=> 28時間30分
↓↓↓ 秒数計算
30600 + 36000 + 36000 / 60 / 60
=> 28.5
↑この数値を→「28:30」に直したい
##合計値が24時間以内の場合
Time.at(seconds).utc.strftime('%R')
Time.at(30600).utc.strftime('%R')
=> "08:30"
これは問題なく動く!
しかし、、、
##合計値が24時間超えるとき(今回の問題)
Time.at(102600).utc.strftime('%R')
=> "04:30" # ← 一周回った値しか返してくれない(Time.atを使用しているので当たり前だが。。。)
#本題
##「28:30」のように表示させたい
seconds = 102600
days = seconds / 86400
# days = 1
↑ まずは何日分かを取得する
time_at = Time.parse("1/1") + seconds - days * 86400
# 2020-01-01 04:30:00 +0900
↑ secondsから先程のdayをひくことで24時間を超える値は取得されない
hours = sprintf("%02d", days * 24 + time_at.hour)
# "28"
↑ 日 × 24 + 時間
min = sprintf("%02d", time_at.min)
# "30"
"#{hours}:#{min}"
# "28:30" となる
####補足
days = seconds / 86400
time_at = Time.parse("1/1") + seconds - days * 86400
↓↓↓↓ # 一行に
time_at = (Time.parse("1/1") + seconds - (day = seconds / 86400) * 86400)
#参考
https://qiita.com/riocampos/items/2c4e4a9b45ad83a0bdc7
ありがとうございます。
####結局は、hourとminを別々の文字列をとし、最終的には文字列にそれぞれの変数を埋め込むように書いただけなので、一発でできるものがあれば教えていただきたいです。
##コメント指摘による改良コード
def hhmmss(sec)
sec_i = sec.to_i # 念の為に整数にしておく(小数点以下切り捨て)
hours = sec_i / 3600
mins = (sec_i - 3600 * hours) / 60
secs = sec_i - 3600 * hours - 60 * mins
sprintf("%d:%02d:%02d", hours, mins, secs)
end
hhmmss(102600)
# => "28:30:00"
sprintf("%d:%02d:%02d", hours, mins, secs)
ここの書き方とか初めて知りました。本当にありがとうございます。
+qiita 書くこと大事だなと実感。。。
なので、今回の場合は
def hhmm(sec)
sec_i = sec.to_i # 念の為に整数にしておく(小数点以下切り捨て)
hours = sec_i / 3600
mins = (sec_i - 3600 * hours) / 60
sprintf("%d:%02d", hours, mins)
end
hhmm(102600)
# => "28:30"
こうなりますね!
わかりやすくて良きですね!