Rails: Active Supportの日付・時刻関連拡張はもっと活用すべき(翻訳)
Active SupportによるRubyコア拡張の中でも、ある意味もっとも便利かつ豊富な機能といえばTime
クラス関連の拡張です。
Railsが生まれた当時の用途のひとつは、定期的に実行されるタスクを便利で使いやすいものにするメソッドを提供することでした。Webアプリケーションではしばしば時間や日付を扱います。
今回は、DateAndTime::Calculations
のメソッドを見ていきましょう。さらに詳しく知りたい方は以下のドキュメントをどうぞ。
以下の機能にはぜひ親しんでおこう
Date
の拡張
today = Date.today
#=> Mon, 03 Oct 2022
today.end_of_week # その週の最後の日を返す
#=> Sun, 09 Oct 2022
today.beginning_of_month # その月の最初の日を返す
#=> Sat, 01 Oct 2022
today.end_of_quarter # その四半期の最後の日を返す
#=> Sat, 31 Dec 2022
today.beginning_of_year # その年の最初の日を返す
#=> Sat, 01 Jan 2022
today.all_day # その日いっぱいを表す日時の範囲を返す
#=> Mon, 03 Oct 2022 00:00:00.000000000 UTC +00:00..Mon, 03 Oct 2022 23:59:59.999999999 UTC +00:00
today.all_week # その週の最初と最後の日による期間を返す
#=> Mon, 03 Oct 2022..Sun, 09 Oct 2022
today.all_month # その月の最初と最後の日による期間を返す
#=> Sat, 01 Oct 2022..Mon, 31 Oct 2022
today.all_year # その年の最初と最後の日による期間を返す
#=> Sat, 01 Jan 2022..Sat, 31 Dec 2022
today.on_weekday? # その日が平日かどうかを返す
#=> true
today.next_occurring(:thursday) # 次の木曜日の日付を返す
#=> Thurs, 06 Oct 2022
DateTime
の拡張1
right_now = Time.zone.now
#=> Mon, 03 Oct 2022 08:30:23.666835000 UTC +00:00
right_now.beginning_of_day # その日の最初の時刻を返す
#=> Mon, 03 Oct 2022 00:00:00.000000000 UTC +00:00
right_now.end_of_week # その週の最後の時刻を返す
#=> Sun, 09 Oct 2022 23:59:59.999999999 UTC +00:00
right_now.beginning_of_month # その月の最初の時刻を返す
#=> Sat, 01 Oct 2022 00:00:00.000000000 UTC +00:00
right_now.end_of_quarter # その四半期の最後の時刻を返す
#=> Sat, 31 Dec 2022 23:59:59.999999999 UTC +00:00
right_now.beginning_of_year # その年の最初の時刻を返す
#=> Sat, 01 Jan 2022 00:00:00.000000000 UTC +00:00
right_now.all_day # その日いっぱいを表す日時の範囲を返す
#=> Mon, 03 Oct 2022 00:00:00.000000000 UTC +00:00..Mon, 03 Oct 2022 23:59:59.999999999 UTC +00:00
right_now.all_week # その週の最初と最後の日時による期間を返す
#=> Mon, 03 Oct 2022 00:00:00.000000000 UTC +00:00..Sun, 09 Oct 2022 23:59:59.999999999 UTC +00:00
right_now.all_month # その月の最初と最後の日時による期間を返す
#=> Sat, 01 Oct 2022 00:00:00.000000000 UTC +00:00..Mon, 31 Oct 2022 23:59:59.999999999 UTC +00:00
right_now.all_year # その年の最初と最後の日時による期間を返す
#=> Sat, 01 Jan 2022 00:00:00.000000000 UTC +00:00..Sat, 31 Dec 2022 23:59:59.999999999 UTC +00:00
right_now.on_weekday? # その時刻が平日かどうかを返す
#=> true
right_now.next_occurring(:thursday) # 次の木曜日の時刻を返す
#=> Thurs, 06 Oct 2022 08:30:23.666835000 UTC +00:00
そうする理由
これらのメソッドは実に便利で、命名もよく考えられています。アプリケーションで日付や時刻のロジックを記述するのにとても役に立ちます。
そうしない理由があるとすれば
Rubyのコアクラスを拡張するこのスタイルは、Railsの「マジック」を好まない一部の人から後ろ指をさされることもありますが、Railsアプリケーションの中で日付の計算を手作りするのはちょっとどうかと思います。
関連記事
-
訳注: 原文では
DateTime
の拡張例のうちtoday.all_week
とtoday.all_month
が不揃いだったため、訳文ではそれぞれright_now.all_week
とright_now.all_month
に修正し、著者にフィードバックしました。 ↩
概要
元サイトの許諾を得て翻訳・公開いたします。
日本語タイトルは内容に即したものにしました。