Golang MySQL时间解析
在使用Golang连接MySQL数据库时,遇到时间类型字段解析的问题。从数据库查询出来的DATETIME类型数据,用time.Time接收时总是报错。尝试过使用database/sql的NullTime和自定义解析,但效果不理想。请问如何正确解析MySQL中的DATETIME和TIMESTAMP类型?能否提供完整的代码示例?
2 回复
使用Golang解析MySQL时间,推荐使用time.Time类型。
- 数据库字段类型:
DATETIME、TIMESTAMP - 使用
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")
注意事项:
- 确保数据库连接参数指定时区(如
parseTime=true&loc=Local)。 - 日期范围需在Go支持的范围内(公元后9999年以内)。
- 使用
sql.NullTime处理可为NULL的时间字段。
通过标准库和驱动配合,可高效处理MySQL时间数据。

