まずはこれを見てほしい。
|
|
それぞれ、「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
もうるう年があるので変動し得る)値であるという認識を持たなければならない。
ちなみに、当然ながらこうなる。
|
|