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

Golang中如何将日期字符串转为Time类型插入MySQL?

问题分析与解决方案

核心原因

问题出在时区转换及历史时区规则差异上:

  • time.Parse默认将解析后的时间设为UTC时区,而time.Now()使用的是本地时区(你的环境为-0300)。
  • 当MySQL驱动把UTC时间转换为数据库连接时区时,由于1941年的时区规则(如夏令时、偏移量变更)与现代规则不一致,导致转换后出现了2秒的偏差(错误信息中的00:00:02),而MySQL的datetime类型无法识别该异常时间值。

解决方案

方案1:指定解析时区为本地时区

用time.ParseInLocation替代time.Parse,直接将日期解析到本地时区,避免后续转换时的时区冲突:

loc, err := time.LoadLocation("Local")
if err != nil {
    // 处理时区加载错误
}
timestamp, err := time.ParseInLocation("2006-01-02", user.Birthdate, loc)
if err != nil {
    // 处理日期解析错误
}

如果知道具体时区(如America/Sao_Paulo),也可以直接指定该时区字符串。

方案2:强制使用UTC时区并同步数据库连接配置

  1. 保持解析后的时间为UTC时区:
timestamp, err := time.Parse("2006-01-02", user.Birthdate) // 默认UTC时区
  1. 在MySQL连接DSN中指定UTC时区,确保驱动转换时不做偏移:
dsn := "username:password@tcp(localhost:3306)/dbname?parseTime=true&loc=UTC"
db, err := sql.Open("mysql", dsn)

方案3:直接构造时间对象

如果日期格式固定,可拆分字符串后用time.Date直接构造时间,避免解析环节的时区问题:

import "strings"
import "strconv"

parts := strings.Split(user.Birthdate, "-")
year, _ := strconv.Atoi(parts[0])
month, _ := strconv.Atoi(parts[1])
day, _ := strconv.Atoi(parts[2])

// 构造UTC时区的时间,也可替换为time.Local使用本地时区
timestamp := time.Date(year, time.Month(month), day, 0, 0, 0, 0, time.UTC)

验证方法

构造完成后执行以下代码,确认输出为1941-09-09 00:00:00,再插入数据库即可正常运行:

fmt.Println(timestamp.Format("2006-01-02 15:04:05"))

内容的提问来源于stack exchange,提问作者ramonfsk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 12:30:58