日付または時刻の差分を求める(日数、秒数)
Rubyで日付または時刻の差分(日数、秒数)を求める方法です。
基本的なことを理解していなかった私が悪いのですが、JavaScriptのノリでDateとTimeを同じように扱おうとしてエラーが出たので、その時のメモになります。
目次
- 2つの日付の差分(日数)を取得する
- 2つの時刻の差分(秒数)を取得する
- 日付(Date)と時刻(Time)の差を求める
2つの日付の差分(日数)を取得する
日付(Date)同士を「-」を使って差を求めると、日数を取得することができます。
# Date.today > 2017-06-22 の場合
Date.today - Date.new(2017, 6 , 1)
# 結果: 21/1
Date.new(2017, 6 , 1) - Date.today
# 結果: -21/1
差し引く方が後の日付ならマイナスになります。
ただ、出力結果を文字列で取得すると、なぜか後ろに「/1」が付加されてしまうので、数値だけ取得して表示したい場合は「to_i」で数値に一旦変換します。
(Date.today - Date.new(2017, 6 , 1)).to_i
# 結果: 21
なにかしらの計算に利用するだけなら、変換しなくてもそのまま利用できました。
Date.today - Date.new(2017, 6 , 1) * 5
# 結果: 105/1
また、DBから取得してきたデータが時刻(Time)型だった場合、日付(Date)型への変換が必要になります。
Date.today - Date.parse(data["updated_at"].to_s)
Date.parseには文字列を渡さないと以下のようなエラーが出るので、「to_s」を忘れないようにつけましょう。
no implicit conversion of Time into String
2つの時刻の差分(秒数)を取得する
時刻(Time)同士を「-」を使って差を求めると、秒数を取得することができます。
puts Time.now - Time.new(2017, 6 , 1)
# 結果: 1882452.115935
puts Time.new(2017, 6 , 1) - Time.now
# 結果: -1882452.115935
2つの時刻の差である1882452を日数に変換すると、
1882452 / 60 / 60 / 24 = 21.787...[日]
となるので、ちゃんと秒数で取得できています。
日付(Date)と時刻(Time)の差を求める
さて、ここが私が躓いたところですが、DateだろうがTimeだろうが差を取得しようとしたら、どちらかに勝手に合わせていいようにやってくれると思ったら、まったくやってくれませんでした。
まず、日付(Date)から時刻(Time)を引こうとすると「expected numeric」というエラーがでます。
Date.today - Time.now
# 結果: expected numeric
逆に、時刻(Time)から日付(Date)を引こうとすると「can't convert Date into an exact number」というエラーが出ます。
Time.now - Date.today
# 結果: can't convert Date into an exact number
私だけ...ではないと思うので、皆さんも気を付けてください。