LoginSignup
3
2

More than 3 years have passed since last update.

Railsの時間処理/時間範囲の指定でActiveSupportのTimeクラスの拡張機能:TimeWithZoneを使う

Posted at

背景

開発中のサービスにおいて、"当日分"のレコードだけを取得する必要があり、どのようにクエリに渡すべきか検討していました。

色々とググったり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.nowTime.currentはユーザー定義によるタイムゾーンの指定があるか否かで返す値が変わる
  • タイムゾーンの指定がない場合には、Time.currentは協定世界時(UTC)を返す
  • Time.nowのタイムゾーンは地方時
  • Active Supportによる拡張機能を利用することで、特定の期間を表す範囲を返すことができる(例: Time.current.all_**)

参照

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2