You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 19:54:01