仕事で月数の差分を出す必要があったのですが、なかなかこれだっていうのが見つからなかったので書きました。
月数の差分を出す
baseを基準日として差分を出すための過去の日付をpastとし、どちらもDate型とします。
baseとpast共に年(year)に12を掛けて年月を月数に直してから減算し、最後に調整値を加算することで算出できます。
def diff_months(base, past)
adjusted_value = base.day >= past.day ? 1 : 0
((base.year * 12) + base.month) - ((past.year * 12) + past.month) + adjusted_value
end
調整値について
1を足す基準が基準日の日にちが過去日の日にち以上というのは実際に例を出したほうがわかりやすいので例示します。
ex. 基準日を2020年3月15日、差分を出す過去日を2019年3月16日とする場合
この場合はちょうど丸1年です。なので差分は12ヶ月となってほしいです。
基準日の日にちbase.dayが15日、過去日の日にちpast.dayが16日なので調整値は0となります。
(24240(= 2020年*12) + 3) - (24228(= 2019年*12) +3) = 12
調整値が0なら12ヶ月となります。
ex. 基準日を2020年3月16日、差分を出す過去日を2019年3月16日とする場合
この場合は2020年の3月16日は13ヶ月目の1日目です。なので差分は13ヶ月となってほしいです。
基準日の日にちbase.dayが16日、過去日の日にちpast.dayが16日なので調整値は1となります。
(24240(= 2020年*12) + 3) - (24228(= 2019年*12) +3) + 1 = 13
以上のように基準日の日にちが差分計算に用いる過去日の日にち以上の場合は調整用に1を足す必要があります。
以上です。とにかく1を足すんだみたいに書いてあったりしたのも見かけましたが、それではうまくいかず調べていくうちにかなり腑に落ちる説明をできるようになったと思います。