Go: time.Time.AddDate()で月を加算するときに注意すること
例えば time.Time 8/31 に AddDate(0, 1, 0) して1ヶ月後の time.Time を取得したいとき。
想定では 8/31 → 9/31 が取得したいと思っていても、暦上 9/31 は存在しないため取得した time.Time は 10/1 となる。
jiroshin.icon 考えてみると当たり前の挙動だが、AddDate()した後の値でロジックを組むときは意図しないバグを生まないよう注意すること。
code: Go
func main() {
t1, _ := time.Parse("2006-01-02", "2021-08-31")
fmt.Printf("t1:%v, nextMonth:%v\n", t1, t1.AddDate(0, 1, 0))
t2, _ := time.Parse("2006-01-02", "2021-08-01")
fmt.Printf("t2:%v, nextMonth:%v\n", t2, t2.AddDate(0, 1, 0))
t3, _ := time.Parse("2006-01-02", "2021-01-31")
fmt.Printf("t3:%v, nextMonth:%v\n", t3, t3.AddDate(0, 1, 0))
}
// Output:
// t1:2021-08-31 00:00:00 +0000 UTC, nextMonth:2021-10-01 00:00:00 +0000 UTC
// t2:2021-08-01 00:00:00 +0000 UTC, nextMonth:2021-09-01 00:00:00 +0000 UTC
// t3:2021-01-31 00:00:00 +0000 UTC, nextMonth:2021-03-03 00:00:00 +0000 UTC