golang AddDate 临界坑

原文链接: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
}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值