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 }