2017.6.22

日付または時刻の差分を求める(日数、秒数)

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

私だけ...ではないと思うので、皆さんも気を付けてください。

Ruby】関連記事