Ruby で2つの日付の中間を計算したかった

に公開

例えば 2020-01-012025-10-14 の中間の日付を導き出したい場合に単純に (a + b) / 2 みたいに計算したいんですが流石に既存ではできません。

require "date"

a = Date.new(2020, 1, 1)
b = Date.new(2025, 10, 14)

# error: 'Date#+': expected numeric (TypeError)
(a + b) / 2

まあですよね。
とりあえず、ミニマムでやるとしたら一旦秒数に変換し、秒数で計算した上でまた 日付 にもどすとかですかね?

require "date"

a = Date.new(2020, 1, 1)
b = Date.new(2025, 10, 14)

result = Time.at((a.to_time.to_i + b.to_time.to_i) / 2).then { Date.new(_1.year, _1.month, _1.day) }
pp result
# => #<Date: 2022-11-22 ((2459906j,0s,0n),+0s,2299161j)>

Date から直接秒数に変換することはできないので #to_time で一度 Time に変換し Time#to_i で秒数に変換して計算した上で更に Date に戻したりしています。
結構めんどい…。
一応それっぽい計算はできそうかな?
何を持って『中間』なのかはアプリケーションによりそうですが。

GitHubで編集を提案

Discussion