まずはこれを見てほしい。
|
|
それぞれ、「8月30日の1ヶ月後」「8月31日の1ヶ月後」という意味だ。しかし、どちらも9月30日を指している。
つまり、こうなる。
|
|
8月が31日まであるのに対して、9月が30日までしかないため、このようなことになってしまう。
もちろん、Time.parse('2021-8-28').since(6.month)とTime.parse('2021-8-29').since(6.month)とTime.parse('2021-8-30').since(6.month)とTime.parse('2021-8-31').since(6.month)も同じになる。
これは1.monthのせい(おかげ)である。
1.monthの意味なら、8月31日の1ヶ月後は10月1日ではなく9月30日であるべきなのだから、理想の動きである(そもそも、ActiveSupportはそういうトリッキーなことをするための拡張モジュールである)。
|
|
なので、例えばテストでday.since(1.month) == day.tomorrow.since(1.month)の検証のようなことをしたいなら、day.since(1.week) == day.tomorrow.since(1.week)にするなどの変更をするとよい。
1.monthはActiveSupport::Durationの中でも変動が激しい(1.yearもうるう年があるので変動し得る)値であるという認識を持たなければならない。
ちなみに、当然ながらこうなる。
|
|