Golang MySQL时间解析

在使用Golang连接MySQL数据库时,遇到时间类型字段解析的问题。从数据库查询出来的DATETIME类型数据,用time.Time接收时总是报错。尝试过使用database/sql的NullTime和自定义解析,但效果不理想。请问如何正确解析MySQL中的DATETIME和TIMESTAMP类型?能否提供完整的代码示例?

2 回复

使用Golang解析MySQL时间,推荐使用time.Time类型。

  • 数据库字段类型:DATETIMETIMESTAMP
  • 使用database/sql包,配合time.Time直接扫描:
var createdAt time.Time
err := db.QueryRow("SELECT created_at FROM table").Scan(&createdAt)
  • 若使用字符串,需手动解析:time.Parse("2006-01-02 15:04:05", timeStr)
    注意时区问题,建议统一使用UTC。

更多关于Golang MySQL时间解析的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Golang中解析MySQL时间数据时,主要涉及time.Time类型与数据库时间格式的相互转换。以下是常见场景及代码示例:


1. 数据库时间类型 → Go时间对象

使用database/sql包和MySQL驱动(如github.com/go-sql-driver/mysql)时,时间字段会自动转换为time.Time

示例代码:

import (
    "database/sql"
    _ "github.com/go-sql-driver/mysql"
    "time"
)

type Record struct {
    ID        int
    CreatedAt time.Time
}

func main() {
    db, err := sql.Open("mysql", "user:pass@tcp(host:3306)/dbname")
    if err != nil {
        panic(err)
    }
    defer db.Close()

    var r Record
    // 查询时间字段(DATETIME/TIMESTAMP)
    err = db.QueryRow("SELECT id, created_at FROM records WHERE id=?", 1).Scan(&r.ID, &r.CreatedAt)
    if err != nil {
        panic(err)
    }
    fmt.Printf("Time: %v\n", r.CreatedAt)
}

2. 字符串时间解析 → Go时间对象

若从数据库读取字符串时间(如VARCHAR存储),需手动解析:

import "time"

func parseMySQLTime(timeStr string) (time.Time, error) {
    // 解析MySQL的DATETIME格式("2006-01-02 15:04:05")
    return time.Parse("2006-01-02 15:04:05", timeStr)
}

// 使用示例
timeStr := "2023-10-05 14:30:00"
t, err := parseMySQLTime(timeStr)

3. 时区处理

MySQL的TIMESTAMP会按系统时区存储,建议统一使用UTC:

// 从数据库读取后转换为本地时间
localTime := r.CreatedAt.Local()

// 存储时转换为UTC
utcTime := time.Now().UTC()
_, err = db.Exec("INSERT INTO records(created_at) VALUES(?)", utcTime)

4. 自定义时间格式

若需特定格式输出:

formatted := r.CreatedAt.Format("2006-01-02 15:04:05")

注意事项:

  1. 确保数据库连接参数指定时区(如parseTime=true&loc=Local)。
  2. 日期范围需在Go支持的范围内(公元后9999年以内)。
  3. 使用sql.NullTime处理可为NULL的时间字段。

通过标准库和驱动配合,可高效处理MySQL时间数据。

回到顶部