💬
ActiveSupport で日付や日時の特定の値だけを増減する
日付や時刻で特定の値のみを変更したい場合に Date#advance
や Time#advance
が利用できます。
require "active_support/all"
# 月を +1 する
pp Date.parse("2020/11/01").advance(months: 1)
# => Tue, 01 Dec 2020
# 月を -1 する
pp Date.parse("2020/11/01").advance(months: -1)
# => Thu, 01 Apr 2021
# 12月を超える場合は年もまたぐ
pp Date.parse("2020/11/01").advance(months: 20)
# => Fri, 01 Jul 2022
# Time も同様
pp Time.parse("2021/03/01 12:34:56").advance(days: 3, hours: -4)
# => 2021-03-04 08:34:56 +0900
また、月末のときに months: 1
すると月の日数を考慮して丸め込まれます。
require "active_support/all"
pp Date.parse("2020/10/31").advance(months: 1)
# => Mon, 30 Nov 2020
pp Date.parse("2020/01/31").advance(months: 1)
# => Sat, 29 Feb 2020
ただし、逆の場合は特に月末に合わせられるわけじゃないので注意してください。
require "active_support/all"
# 3月の月末日になるわけではない
pp Date.parse("2020/02/28").advance(months: 1)
# => Sat, 28 Mar 2020
Discussion