golang AddDate 临界坑

Time.AddDate方法对月年做加减时,若当前天数大于目标月的天数,则会自动再加上多余的天数!如:

package main
 
import (
	"fmt"
	"time"
)
 
func main() {
	const date_format = "2006-01-02"
	srcTime, _ := time.Parse(date_format, "2020-12-31")
	fmt.Println(srcTime.AddDate(0, -1, 0)) //result: 2020-12-01 00:00:00 +0000 UTC
	srcTime, _ = time.Parse(date_format, "2020-02-29")
	fmt.Println(srcTime.AddDate(1, 0, 0)) //result: 2021-03-01 00:00:00 +0000 UTC
}

这并符合我们的一些使用场景,如12.31减一月在一些场景中我们就希望为11.30。为此,我写了个工具函数来扩展支持此功能,在此记录一下

package utils
 
import (
	"time"
)
 
func AddDate(t time.Time, year, month, day int) time.Time {
	//先跳到目标月的1号
	targetDate := t.AddDate(year, month, -t.Day()+1)
	//获取目标月的临界值
	targetDay := targetDate.AddDate(0, 1, -1).Day()
	//对比临界值与源日期值,取最小的值
	if targetDay > t.Day() {
		targetDay = t.Day()
	}
	//最后用目标月的1号加上目标值和入参的天数
	targetDate = targetDate.AddDate(0, 0, targetDay-1+day)
	return targetDate
}