Golang 内置日期函数获取上一个月日期异常
 
			今天生产环境出现比较多的异常,挺纳闷的,毕竟最近该服务没有怎么迭代。
经过排查定位发现,居然是某些特殊日子才会出现的问题。
RetentionMonths = 3
MonthTablePrefix = “jobs_”
代码是一个分表逻辑中,获取最近月份的表,通过 AddDate(0, -i, 0) 函数获取前几个月的表。应返回当前月和前3个月的分表名数组。[jobs_202510 jobs_202509 jobs_202508 jobs_202507](golang 1.19)
| 1 | // GetRecentHotTables 获取最近n个月的热表名称列表 | 
光看代码感觉是没啥问题的,为啥怀疑到这段代码,也是通过日志发现,查询表的sql 只查 2025-10, 2025-08, 2025-07 表,缺了2025-09表。
所以本地验证一番。(单元测试还通过了。。。因为验证的代码和里面一样。。。)
| 1 | === RUN TestGetRecentHotTables | 
看输出发现 jobs_202510 jobs_202510 有两个,问题就在这里了。
| 1 | now := time.Now() | 
预期是输出 202509 的,但现实是 202510
那为什么呢?通过询问google,找到下面相关文章说明,大致意思就是,因为10-31 减去一个月为 09-31, 但是又因为9月没有31号,就将日期标准化为 10-01,保证了time值的有效性。
https://github.com/golang/go/issues/31145
https://learnku.com/articles/71760
在 learnku 文章中提到php,然后用php类似函数试了一下,也有类似问题(php8.1)
| 1 | echo date('Y-m-d', strtotime('-1 months')); | 
周五给我整个这个,真是够了。
修改方案, 减去当前时间的天数,时间调整到上一个月最后一天:
| 1 | now := time.Now() | 
js moment 试了是正常的
| 1 | console.log(moment(new Date()).subtract(1, 'months').format('YYYY-MM-DD')) | 
- 标题: Golang 内置日期函数获取上一个月日期异常
- 作者: Attson
- 创建于 : 2025-10-31 18:42:21
- 更新于 : 2025-10-31 10:50:34
- 链接: https://attson.github.io/p/golang-date-add-month-error.html
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
        评论
    
    
        
            
    
    
    
        
    
