MySQL、Go与Unix时间转换问题:计算班次剩余分钟数
解决MySQL、Go与Unix时间格式转换及班次剩余分钟数计算问题
核心问题梳理
从MySQL获取的YYYY-MM-DD HH:MM:SS格式时间字符串、Go的time.Now()时间对象,需要统一转换为自Unix纪元以来的分钟数,才能计算班次剩余时间。同时需修正原代码中的变量名错误、类型错误。
完整代码实现及关键转换逻辑
import ( "database/sql" "fmt" "time" _ "github.com/go-sql-driver/mysql" // 导入MySQL驱动 ) func calculateRemainingMins(assetid string) (int, error) { var shiftStartDB string // 示例:2022-01-01 09:00:00 var shiftStartUnix int // 转换为Unix纪元以来的分钟数 var offTimer int // 班次时长(小时) var templateID string var minsToGo int // 1. 从assets表查询班次信息 err := db.QueryRow("SELECT LastSignedOn, OffTimer, TemplateID FROM assets WHERE ID = ?", assetid).Scan(&shiftStartDB, &offTimer, &templateID) if err != nil { return 0, fmt.Errorf("query assets failed: %w", err) } // 2. 如果班次时长为0,从templates表获取 if offTimer == 0 { err = db.QueryRow("SELECT OffTimer FROM templates WHERE ID = ?", templateID).Scan(&offTimer) if err != nil { return 0, fmt.Errorf("query templates failed: %w", err) } } // 3. 将MySQL时间字符串转换为Unix分钟数 // 注意:如果MySQL时间是UTC时区,需替换为time.UTC layout := "2006-01-02 15:04:05" shiftStartTime, err := time.ParseInLocation(layout, shiftStartDB, time.Local) if err != nil { return 0, fmt.Errorf("parse shift start time failed: %w", err) } shiftStartUnix = int(shiftStartTime.Unix() / 60) // 转成分钟数 // 4. 计算班次结束时间的Unix分钟数 shiftEndUnix := shiftStartUnix + (offTimer * 60) // 5. 将Go当前时间转换为Unix分钟数 nowUnix := int(time.Now().Unix() / 60) // 6. 计算剩余分钟数(处理班次已结束的情况) minsToGo = shiftEndUnix - nowUnix if minsToGo < 0 { minsToGo = 0 // 班次已结束,剩余时间设为0 } return minsToGo, nil }
关键转换说明
- MySQL时间字符串转Unix分钟:
使用time.ParseInLocation解析字符串,第一个参数是Go的参考时间布局(必须严格对应2006-01-02 15:04:05),第三个参数指定时区(根据数据库时间时区选择time.Local或time.UTC)。解析后用Unix()获取秒数,除以60得到分钟数。 - Go当前时间转Unix分钟:
time.Now().Unix()获取当前时间的Unix秒数,除以60转换为分钟数,再转为int类型。 - 错误处理:
去掉原代码中忽略错误的_,添加实际错误捕获与包装,方便排查问题。
代码修正点
- 原代码中
nowTime Time.time应为time.Time(Go标准时间类型写法) - 变量
offTimerTemp未定义,实际应为offTimer - 最终计算时的
shiftEndInt、nowInt是笔误,对应shiftEndUnix、nowUnix
内容的提问来源于stack exchange,提问作者Robert McDougall
相关产品推荐
相关产品推荐

