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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 20:00:37