[Ruby]日時が特定日時の範囲内にあるかのチェック

(image)[Ruby]日時が特定日時の範囲内にあるかのチェック

TimeWithZone#between? で範囲内判定

特定日付が範囲内にあるかの判定を行うには ActiveSupport::TimeWithZone#between? が使える。

# 日時.between?(始端, 終端)
Time.now.between?(Date.yesterday, Date.tomorrow)

実際に範囲内チェックを行うとこんな感じ。

> Time.now.between?(Date.yesterday, Date.tomorrow)
=> true

> Time.now.between?(1.week.ago, Date.yesterday)
=> false

> Time.now.between?(Date.tomorrow, 1.week.since)
=> false

ただ上記の書き方の場合、始端もしくは終端が nil の場合にエラーが出てしまう。

Date.today.between?(Date.yesterday, nil)
ArgumentError: comparison of Date with nil failed
from (pry):9:in `between?`

Range#cover? で範囲内判定

上述の問題が回避するには、Rubyの Range#cover? が使える。

# (始端..終端).cover? 日時
> (Date.yesterday..Date.tomorrow).cover? Time.now
=> true

始端/終端が nil の場合

# 始端がnil
> (nil..Date.tomorrow).cover? Time.now
=> true

# 終端がnil
> (Date.yesterday..nil).cover? Time.now
=> true

下記の通り範囲内から外れた場合は false が帰ってくる。

> (nil..Date.yesterday).cover? Time.now
=> false
> (Date.tomorrow..nil).cover? Time.now
=> false