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

Go语言实现区块过期标记:t.Add方法失效问题排查

问题排查与修复

核心问题

你的代码存在两个关键问题,导致过期时间计算失效:

  1. time.ParseDuration格式错误:该函数支持的分钟格式是"m"(如"5m"),但你用"%dmins"生成了"5mins"这类不符合规则的字符串,最终解析出的mins值为0,t.Add()操作等于没加时间。
  2. 忽略所有错误:用_接收错误的写法,让你完全没意识到解析时长、加载时区、解析创建时间这些步骤已经失败,根本没生成正确的初始时间。

修复步骤

  1. 修正时长计算逻辑
    如果v.SalePeriod是整数类型(表示分钟数),直接转换为time.Duration更可靠,无需使用ParseDuration:

    // 假设v.SalePeriod是int类型
    mins := time.Duration(v.SalePeriod) * time.Minute
    

    若必须用ParseDuration,需把格式改为"%dm":

    durationStr := fmt.Sprintf("%dm", v.SalePeriod)
    mins, err := time.ParseDuration(durationStr)
    if err != nil {
        log.Printf("解析时长失败: %v", err)
        return
    }
    
  2. 添加错误处理
    不要忽略时区加载、创建时间解析的错误,这些步骤出错会直接导致时间计算完全错误:

    local, err := time.LoadLocation("Local")
    if err != nil {
        log.Printf("加载本地时区失败: %v", err)
        return
    }
    t, err := time.ParseInLocation("2006-01-02 15:04:05", v.CreateTime, local)
    if err != nil {
        log.Printf("解析创建时间失败: %v", err)
        return
    }
    
  3. 添加调试日志
    在计算完过期时间后,打印相关时间值,确认计算是否符合预期:

    vTime := t.Add(mins)
    log.Printf("调试信息: 创建时间=%v, 有效期=%v分钟, 过期时间=%v, 当前时间=%v", t, v.SalePeriod, vTime, time.Now().Local())
    

修复后的完整代码片段

// 直接将SalePeriod转换为分钟时长
mins := time.Duration(v.SalePeriod) * time.Minute

local, err := time.LoadLocation("Local")
if err != nil {
    log.Printf("加载时区失败: %v", err)
    return
}

t, err := time.ParseInLocation("2006-01-02 15:04:05", v.CreateTime, local)
if err != nil {
    log.Printf("解析创建时间失败: %v", err)
    return
}

vTime := t.Add(mins)
log.Printf("调试: 创建时间=%v, 过期时间=%v, 当前时间=%v", t, vTime, time.Now().Local())

if time.Now().Local().After(vTime) {
    // 组装智能合约调用参数
    var bodyBytes [][]byte   
    bodyBytes = append(bodyBytes, []byte(v.ObjectOfSale))
    bodyBytes = append(bodyBytes, []byte(v.Seller))
    bodyBytes = append(bodyBytes, []byte(v.Buyer))
    bodyBytes = append(bodyBytes, []byte("expired"))
    
    resp, err := bc.ChannelExecute("updateSelling", bodyBytes)
    if err != nil {
        log.Printf("调用智能合约失败: %v", err)
        return
    }
    
    var data map[string]interface{}
    if err = json.Unmarshal(resp.Payload, &data); err != nil {
        log.Printf("解析合约返回数据失败: %v", err)
        return
    }
    fmt.Println(data)
}

内容的提问来源于stack exchange,提问作者Sanket Singhal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 22:30:56