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

Go语言TTL过期检查器始终返回false问题求助

问题排查与解决方案

核心问题:时区不匹配

你的IsExpired函数存在时区不一致的问题:

  • time.Parse("2006-01-02 15:04:05", creationDate)解析不带时区的字符串时,返回的createdAt是UTC时区的时间。
  • time.Now()返回的是本地时区的时间。

两者时区不同导致时间比较逻辑完全错误。比如你的本地时区是东八区(UTC+8):

  • 解析"2023-06-08 18:08:22"得到的是2023-06-08 18:08:22 +0000 UTC
  • 加上2秒TTL后,过期时间是2023-06-08 18:08:24 +0000 UTC
  • 此时本地时间的2023-06-08 18:08:24对应的UTC时间是2023-06-08 10:08:24,远早于过期时间,所以currentTime.After(expirationTime)永远返回false。

修复方案

方案1:统一使用UTC时间

修改IsExpired函数,让time.Now()使用UTC时间,保持与时区一致:

func IsExpired(creationDate string, ttl int) (bool, error) {
    createdAt, err := time.Parse("2006-01-02 15:04:05", creationDate)
    if err != nil {
        return false, err
    }

    expirationTime := createdAt.Add(time.Duration(ttl) * time.Second)
    currentTime := time.Now().UTC() // 改用UTC时间

    return currentTime.After(expirationTime), nil
}

方案2:解析时指定本地时区

如果你的creationDate是本地时区的时间,解析时指定本地时区,确保比较的是同一时区的时间:

func IsExpired(creationDate string, ttl int) (bool, error) {
    layout := "2006-01-02 15:04:05"
    loc, err := time.LoadLocation("Local") // 加载本地时区
    if err != nil {
        return false, err
    }

    createdAt, err := time.ParseInLocation(layout, creationDate, loc)
    if err != nil {
        return false, err
    }

    expirationTime := createdAt.Add(time.Duration(ttl) * time.Second)
    currentTime := time.Now()

    return currentTime.After(expirationTime), nil
}

其他排查点

如果修复时区问题后仍未解决,检查以下内容:

  • 确认readFromCache()每次读取的是最新数据,而非缓存的旧值。
  • 验证data.TTL的解析是否正确:打印data.TTL的值,确保它确实是JSON中指定的2。
  • 检查time.Now()的时区是否符合预期:可以打印currentTime和expirationTime的完整信息(包括时区),确认两者的比较逻辑。

内容的提问来源于stack exchange,提问作者Dev-Siri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 22:43:15