Go语言实现区块过期标记:t.Add方法失效问题排查
问题排查与修复
核心问题
你的代码存在两个关键问题,导致过期时间计算失效:
time.ParseDuration格式错误:该函数支持的分钟格式是"m"(如"5m"),但你用"%dmins"生成了"5mins"这类不符合规则的字符串,最终解析出的mins值为0,t.Add()操作等于没加时间。- 忽略所有错误:用
_接收错误的写法,让你完全没意识到解析时长、加载时区、解析创建时间这些步骤已经失败,根本没生成正确的初始时间。
修复步骤
修正时长计算逻辑
如果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 }添加错误处理
不要忽略时区加载、创建时间解析的错误,这些步骤出错会直接导致时间计算完全错误: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, 当前时间=%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
相关产品推荐
相关产品推荐

