😽

Rails で対象の日時がある期間内かどうかを判定する

2022/11/01に公開約1,200字

はじめに

Rails で対象の日時がある期間以内かどうかを判定する実装をいくつかまとめました。
例えば 4/1 は 3/1 から 5/1 までの期間内かどうかなどです。

1. <=, >= を使う

Date 型は比較演算子を使えるので以下のような実装ができます

start_date = Date.parse('2022/03/01')
end_date = Date.parse('2022/05/01')
target_date = Date.parse('2022/04/01')

start_date <= target_date && target_date <= end_date
# => true

2. before? と after? を使う

ActiveSupport により Date.before?(Date.after?) が使えるようになります。
呼び出し元と引数が同じ日付だと false を返すので、ある期間以内かどうかを判定するには以下のような実装となります。

start_date = Date.parse('2022/03/01')
end_date = Date.parse('2022/05/01')
target_date = Date.parse('2022/04/01')

!start_date.before?(target_date) && !end_date.after?(target_date)
# => true

3. TimeZone#between? を使う

これが一番シンプルに書けます。引数どちらかが nil の場合エラーになります。

start_date = Date.parse('2022/03/01')
end_date = Date.parse('2022/05/01')
target_date = Date.parse('2022/04/01')

target_date.between?(start_date, end_date)
# => true

4. Range#cover? を使う

こちらは始端・終端が nil の場合でも使えるので start_date が nil でも target_date が end_date 以前であれば true としたいみたいなケースではこちらの方が良さそうです。

start_date = Date.parse('2022/03/01')
end_date = Date.parse('2022/05/01')
target_date = Date.parse('2022/04/01')

(start_date..end_date).cover?(target_date)
# => true

Discussion

ログインするとコメントできます