Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

Rails: Active Supportの日付・時刻関連拡張はもっと活用すべき(翻訳)

概要

元サイトの許諾を得て翻訳・公開いたします。

日本語タイトルは内容に即したものにしました。

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アプリケーションの中で日付の計算を手作りするのはちょっとどうかと思います。

関連記事

Rails: present?より便利なActiveSupportのpresenceメソッド(翻訳)


  1. 訳注: 原文ではDateTimeの拡張例のうちtoday.all_weektoday.all_monthが不揃いだったため、訳文ではそれぞれright_now.all_weekright_now.all_monthに修正し、著者にフィードバックしました。 

CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。