動かざることバグの如し

近づきたいよ 君の理想に

Railsで期間内の月数をカウントする方法

環境

やりたいこと

Railsで期間を与えてその中に含まれる月の数を数えたい。

コード

def count_months(start_date, end_date)
  (start_date.beginning_of_month..end_date.end_of_month).map { |d| [d.year, d.month] }.uniq.count
end

# 使用例
start_date = Date.new(2024, 1, 15)
end_date = Date.new(2024, 3, 5)
months = count_months(start_date, end_date)
# => 3

count_months メソッドでは、まず開始日と終了日をそれぞれ月の最初と最後に変換している。 map { |d| [d.year, d.month] } で日付の範囲を [年, 月] の配列に変換し、 uniq で重複する月を削除している。 最後に count メソッドで、ユニークな月の数をカウントしている。 この例では、開始日が2024年1月15日で、終了日が2024年3月5日なので、含まれる月は1月、2月、3月の3ヶ月となる。