5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Ruby] 時間フォーマット変換("HH:MM")

Last updated at Posted at 2020-04-07

##やりたいこと

注意:コメント指摘によるコードの改良も行っているので、ぜひ最後までみてください〜


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"

こうなりますね!
わかりやすくて良きですね!

5
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?