原文链接:https://libuba.com/2021/01/08/golan-adddate-%e4%b8%b4%e7%95%8c%e5%9d%91/
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
}