💬

ActiveSupport で日付や日時の特定の値だけを増減する

2024/11/06に公開

日付や時刻で特定の値のみを変更したい場合に Date#advanceTime#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

関連

GitHubで編集を提案

Discussion