首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >记录一个坑time.AddDate

记录一个坑time.AddDate

作者头像
golangLeetcode
发布2026-03-18 16:49:56
发布2026-03-18 16:49:56
760
举报

今天是2025年3月31日,遇到一个问题,计算上个月的月份

代码语言:javascript
复制
time.Now().AddDate(0,-1,0).Format("200601")

如果不深入源码查看,会想当然得到结论,上述返回为

代码语言:javascript
复制
202502

实际测试后发现,不对,输出如下

代码语言:javascript
复制
202503

刚开始一顿怀疑,毕竟月初才测试过的代码,放几天就变质了?检查后发现没有变更记录。

然后重新测试了下下面的case

代码语言:javascript
复制
    fmt.Println(time.Now().AddDate(0,-1,0),time.Now().AddDate(0,1,0))

输出如下

代码语言:javascript
复制
2025-03-03 14:16:39.761 +0000 UTC 
2025-05-01 14:16:39.761001 +0000 UTC

更加疑惑了,于是看了下AddDate的源码

代码语言:javascript
复制
// time/time.go

func (t Time) AddDate(years int, months int, days int) Time {
    year, month, day := t.Date() // 获取当前年月日
    hour, min, sec := t.Clock() // 获取当前时分秒
    return Date(year+years, month+Month(months), day+days, hour, min, sec, int(t.nsec()), t.Location())
}

有这么一行注释

代码语言:javascript
复制
AddDate returns the time corresponding to adding the given number of years, months, and days
to t. For example, AddDate(-1, 2, 3) applied to January 1, 2011 returns March 4, 2010.
AddDate normalizes its result in the same way that Date does, so, for example, adding one
month to October 31 yields December 1, the normalized form for November 31.

翻译下:AddDate根据指定的年、月、日数字,加到原来的 time 类型值上并返回。比如对于 2011-1-1 这个日期,执行 AddDate(-1, 2, 3) 会返回 2010-3-4。AddDate 将它的结果按实际日期进行标准化,所以,比如在10月31日加上一个月,会返回12月1日,而不是11月31日。

具体到我们上面遇到的case,2025-03-31执行AddDate(0,1,0)会变成2025-04-31,由于4月只有30天,会标准化后变成2025-05-01。同样的执行AddDate(0,-1,0)会变成2025-02-31,由于2月只有28天,标准化后会变成2025-03-03.

具体看源码我们会发现,AddDate函数只会在对应的年月日上进行对应的加减法,然后执行标准化,并不是我们日常理解的变成上个月的今天。

如何获取上/下个月呢?其实就是计算当月的0日,或者下下个月的0日

代码语言:javascript
复制
package main
import(
    "time"
    "fmt"
)
func main(){
today := time.Date(2025, 03, 31, 0, 0, 0, 0, time.Local)
d := today.Day()
// 上个月最后一天
// 03-00 日 等于 02-28 日
day1 := today.AddDate(0, 0, -d)
fmt.Println(day1.Format("20060102"))
// 下个月最后一天
// 05-00 日 等于 04-30 日
day2 := today.AddDate(0, 2, -d)
fmt.Println(day2.Format("20060102"))
/*
20250228
20250430
*/
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-03-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 golang算法架构leetcode技术php 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档