Date/Timeにこの週・月・年を判定するメソッドを追加

rails/rails

DateやTimeオブジェクトが現在の週・月・年に属するかを判定するthis_week?this_month?this_year?メソッドが追加されました。既存のtoday?tomorrow?yesterday?と同様のインターフェースで、時間範囲の判定をシンプルに記述できるようになります。

背景

ActiveSupportにはtoday?tomorrow?yesterday?という日単位の時間判定メソッドが存在していましたが、週・月・年単位の判定メソッドは提供されていませんでした。#55770は、この週・月・年単位の判定を既存の日単位メソッドと同じインターフェースで提供することで、コードの可読性を向上させています。

PRの説明によれば、これらのメソッドは時間インスタンスを現在の期間に対してクエリするのに有用です。

技術的な変更

activesupport/lib/active_support/core_ext/date_and_time/calculations.rbDateAndTime::Calculationsモジュールに3つの判定メソッドが追加されました。

追加されたメソッド:

# Returns true if the date/time falls within the current week.
def this_week?
  ::Date.current.all_week.include?(to_date)
end

# Returns true if the date/time falls within the current month.
def this_month?
  ::Date.current.all_month.include?(to_date)
end

# Returns true if the date/time falls within the current year.
def this_year?
  ::Date.current.all_year.include?(to_date)
end

各メソッドはDate.currentを基準に、対象の日付が該当する範囲に含まれるかを判定します。to_dateにより、TimeオブジェクトもDateに変換して判定できる設計です。

使用例:

unless post.created_at.this_week?
  link_to "See week recap", week_recap_path(date)
end

if invoice.due_at.this_month?
  # 今月中の支払期限
end

reports.select { |r| r.created_at.this_year? }

実装は既存のall_weekall_monthall_yearメソッドを呼び出す形で行われており、これらのメソッドが返す範囲オブジェクトのinclude?メソッドを使用して判定しています。

テストケース

activesupport/test/core_ext/date_time_ext_test.rbに境界値テストが追加されました。

this_week?のテスト:

def test_this_week
  Date.stub(:current, Date.new(2000, 1, 5)) do # Wed, 2000-01-05
    assert_equal false, Time.utc(2000, 1, 2, 23, 59, 59).this_week?
    assert_equal true,  Time.utc(2000, 1, 3, 0, 0, 0).this_week?
    assert_equal true,  Time.utc(2000, 1, 9, 23, 59, 59).this_week?
    assert_equal false, Time.utc(2000, 1, 10, 0, 0, 0).this_week?
  end
end

2000年1月5日(水曜日)を現在日として、週の始まり(月曜日の1月3日 0:00:00)と終わり(日曜日の1月9日 23:59:59)の境界で正しく判定されることを検証しています。同様にthis_month?this_year?のテストも月・年の境界で判定が正確であることを確認しています。

本PRは、Railsの時間判定APIに週・月・年単位の判定メソッドを追加した変更です。既存のtoday?などの日単位メソッドと同じインターフェースを提供することで、日常的なコーディングでよく使われる時間範囲判定をより直感的に記述できるようになりました。

記事メタデータ

Generated by:
Claude Sonnet 4.5 for DiffDaily

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
リトライ後承認
Review Count:
2回 (改善を経て承認)
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ⚠ WARNING

Title, Context, Technical Detailの存在と明確さ

リード文(総論)、背景・技術的な変更(各論)は適切に構成されていますが、結論部分がリード文の繰り返しに近く、独立した「まとめ」セクションとして構成されていません。

カスタムMarkdown構文 ✓ PASS

シンタックスハイライト・GitHubリンク記法の正確性

ファイル名付きシンタックスハイライトやGitHubのPRリンク記法は、ガイドラインに沿って正しく使用されています。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

ActiveSupportのコア拡張に関する内容であり、対象読者であるエンジニアに適した技術レベルと専門性で記述されています。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクション・各パラグラフが論理的に構成されており、トピックセンテンスが明確なため、非常に読みやすいです。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事内で引用されている実装コードおよびテストコードは、提供されたDiff情報と完全に一致しています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

モジュール名(DateAndTime::Calculations)やメソッド名(all_week, to_dateなど)といった技術用語が正確に使用されています。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

メソッドの実装ロジックやテストケースの意図に関する説明は、コードの内容と整合しており、技術的に正確です。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

記事内の主張はすべてPRのタイトル、説明、Diff情報によって裏付けられており、ハルシネーション(捏造)は見られません。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR番号(#55770)やファイルパス、コード内の数値など、すべての数値・固有名詞は正確です。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事のタイトルはPRの内容を的確に要約しており、主題に齟齬はありません。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

PRで言及されていない外部知識(バージョンのサポート状況など)の追記はなく、提供された情報に忠実です。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

機能追加という文脈において、「追加されました」といった時間表現は適切に使用されています。