背景
開発中のサービスにおいて、"当日分"のレコードだけを取得する必要があり、どのようにクエリに渡すべきか検討していました。
色々とググったりRailsガイドを漁ってみたりしたところ、ActiveSupport::TimeWithZone
クラスを利用することでうまい具合にできたので共有&メモっておきます。
結論としては、Time.current.all_day
で"当日分だけ”に該当するレコードを指定することだできました。
ActiveSupportとは
Active SupportはRuby on Railsのコンポーネントであり、Ruby言語の拡張、ユーティリティ、その他横断的な作業を担っています。
Active Supportは言語レベルで基本部分を底上げして豊かなものにし、Railsアプリケーションの開発とRuby on Railsそれ自体の開発に役立てるべく作られています。
引用:Railsガイド/Active Support コア拡張機能
Supportの名の通りRailsでの開発で便利な機能を提供してくれるもので、各クラス(e.g. String, Array, Integer etc)の拡張機能などを提供します。
Ruby on Railsのアプリケーションでは、基本的には全てのActive Supportがデフォルトで読み込まれていますので、特段必要な設定などはありません。
ActiveSupportによるTimeクラスの拡張
Time.current
ActiveSupportの提供する拡張機能にはTimeクラスに関するものもあり、その中でTime.current
という現在時刻を返すメソッドを提供しています。
Timeクラスにおいては類似のメソッドとしてTime.now
も提供されていますが、Time.current
はアプリケーション側でタイムゾーンの指定がある場合には指定のタイムゾーンに従った現在時刻を表示します。
# 2019/09/04 00:00:00の場合
(a)タイムゾーン指定なしの場合
$ Time.now
=> 2019-09-04 00:00:00 +0900
$ Time.current
=> Tue, 03 Sep 2019 15:00:00 UTC +00:00
(b)タイムゾーンをTokyoに指定した場合
$ Time.now
=> 2019-09-04 00:00:00 +0900
$ Time.current
=> Wed, 04 Sep 2019 00:00:00 JST +09:00
all_day, all_week, all_month, all_quarter, all_year
指定した期間を表す範囲を返すメソッドもActiveSupportで提供されています。
Time.now
またはTime.current
に対して呼び出すことで、現在時刻を含む期間の範囲を返します。
$ now = Time.current
=> Wed, 04 Sep 2019 00:00:00 JST +09:00
# 現在時刻を含む「1日」の範囲を返す
$ now.all_day
=> Wed, 04 Sep 2019 00:00:00 JST +09:00..Wed, 04 Sep 2019 23:59:59 JST +09:00
# 現在時刻を含む「1週間」の範囲を返す
$ now.all_week
=> Mon, 02 Sep 2019 00:00:00 JST +09:00..Sun, 08 Sep 2019 23:59:59 JST +09:00
# 現在時刻を含む「1ヶ月間」の範囲を返す
$ now.all_month
=> Sun, 01 Sep 2019 00:00:00 JST +09:00..Mon, 30 Sep 2019 23:59:59 JST +09:00
# 現在時刻を含む「四半期」の範囲を返す
$ now.all_quarter
=> Mon, 01 Jul 2019 00:00:00 JST +09:00..Mon, 30 Sep 2019 23:59:59 JST +09:00
# 現在時刻を含む「1年間」の範囲を返す
$ now.all_year
=> Tue, 01 Jan 2019 00:00:00 JST +09:00..Tue, 31 Dec 2019 23:59:59 JST +09:00
その他Timeクラスの拡張
そのほかにTime.current
を起点とした翌前日の日時を返すメソッドや翌前月を返すメソッド、などあります。
詳細はRailsガイドを参照してください。
参照: Railsガイド AcvtiveSupport Timeの拡張
まとめ
- Active SupportはRailsにデフォルトで読み込まれている開発に役立つライブラリで、各クラスの拡張機能を提供する
-
Time.now
とTime.current
はユーザー定義によるタイムゾーンの指定があるか否かで返す値が変わる - タイムゾーンの指定がない場合には、
Time.current
は協定世界時(UTC)を返す -
Time.now
のタイムゾーンは地方時 - Active Supportによる拡張機能を利用することで、特定の期間を表す範囲を返すことができる(例:
Time.current.all_**
)