Go语言中如何更优表示一年时间时长 优化刷新令牌过期校验逻辑
Go 中刷新令牌一年有效期判断的优化实现
原写法的问题
365*24*time.Hour的硬编码写法存在两个明显缺陷:
- 仅按平年计算时长,没有考虑闰年366天的情况,若业务要求为自然日历年满一年,计算结果会存在1天的误差
- 魔数可读性差,后续维护人员需要额外推导该数值的含义,调整规则时也容易漏改
更合理的实现方案
方案1:自然年计算(推荐,适配绝大多数业务场景)
如果业务规则是「自创建时间起,到下一年的同月同日就算满一年」,直接使用标准库的AddDate方法即可,自动处理闰年、大小月天数差异:
// RefreshTokenExpired :nodoc: func (s *Session) RefreshTokenExpired() bool { createdAtUTC := s.CreatedAt.UTC() // 直接在创建时间基础上加1年,自动处理日历规则 expireThreshold := createdAtUTC.AddDate(1, 0, 0) nowUTC := s.RefreshTokenExpiredAt.UTC() return nowUTC.After(expireThreshold) || nowUTC.Equal(expireThreshold) }
优势:
- 完全符合自然年的计算逻辑,不存在闰年误差
- 代码语义清晰,无需额外注释就能看懂是判断是否满1年
方案2:固定时长计算
如果业务规则明确要求有效期为实打实的8760小时(不考虑闰年,必须凑够365个自然天),可以将硬编码抽成常量提高可维护性:
// 刷新令牌固定有效时长:365天 const refreshTokenValidity = 365 * 24 * time.Hour // RefreshTokenExpired :nodoc: func (s *Session) RefreshTokenExpired() bool { return s.RefreshTokenExpiredAt.UTC().Sub(s.CreatedAt) >= refreshTokenValidity }
优势:
- 常量语义明确,后续调整有效期只需修改常量定义即可,无需修改业务逻辑代码
注意事项
- 计算前统一将两个时间转为相同时区(示例中统一转UTC),避免跨时区场景下出现计算误差
内容的提问来源于stack exchange,提问作者Rza
相关产品推荐
相关产品推荐

