解决gin中时间格式

近日见闻

  1. Hyperledger Fabric Certified Practitioner (HFCP) 认证预约开放,感兴趣的可以看一下。

https://training.linuxfoundation.cn/certificates/32

  1. 2023年8月15日,kubernetes1.28更新,这更新速度真的很给力。1.24于 2023-05-28进入维护模式,生命周期结束于2023-07-28。1.23已经在2月28日停止支持。

  2. 阿里云推出数字人视频生成工具Live Portait,上传一张照片和一段文本或语音即可生成一段开口说话的数字人视频。该功能可应用于视频直播、聊天机器人、企业营销等场景。目前,该工具已在魔搭社区创空间开放体验。

  3. 讯飞星火模型已开放测试,可以申请试一下。

解决gin中报错

报错内容:

sql: Scan error on column index 3, name "created_at": unsupported Scan, storing driver.Value
 type []uint8 into type *time.Time; sql: Scan error on column index 3, name "created_at": unsupported Scan,
 storing driver.Value type []uint8 into type *time.Time; sql: Scan error on column index 3, name "created_a
t": unsupported Scan, storing driver.Value type []uint8 into type *time.Time; sql: Scan error on column index 3, name "created_at": unsupported Scan, storing driver.Value type []uint8 into type *time.Time

后端请求的返回数据:

"created_at": "0001-01-01T00:00:00Z"

解决方案:

数据库连接添加设置parseTime=true,即可: dsn := "root:123456@tcp(localhost)/mydb?charset=utf8&parseTime=true"

原因:

搜索之后,有小伙伴说这个报错是因为在将uint8类型的值存储到time.Time类型时,发生了不兼容的扫描错误。这可能是因为数据库中"created_at"列的数据类型与程序中定义的time.Time类型不匹配。为了解决这个问题,你需要检查数据库中"created_at"列的数据类型,并确保它与程序中定义的类型相匹配。如果需要,你可以尝试将[]uint8类型的值转换为适当的时间格式,然后再存储到*time.Time类型中。

可以使用time包中的Parse方法将[]uint8类型的值转换为time.Time类型:

import (
    "database/sql"
    "fmt"
    "time"
)

// ...

var createdAt time.Time
if err := row.Scan(&createdAt); err != nil {
    log.Fatal(err)
}

// 假设[]uint8类型的值是一个表示时间的字符串,如"2022-01-01 00:00:00"
inputTimeStr := "2022-01-01 00:00:00"
inputTime, err := time.Parse("2006-01-02 15:04:05", inputTimeStr)
if err != nil {
    log.Fatal(err)
}

fmt.Println(inputTime) // 输出:2022-01-01 00:00:00 +0000 UTC

当然最简单的还是添加参数,但是,为什么在设置parseTime=true之后又可以呢?

parseTime=true:这个参数告诉MySQL驱动在将数据库中的日期时间类型解析为Go的time.Time类型时使用时间解析。如果没有设置这个参数,MySQL驱动会将日期时间类型解析为原始的[]uint8字节数组,从而导致错误。所以,当你在连接数据库时设置了parseTime=true,MySQL驱动就会按照正确的方式解析日期时间类型,避免了遇到的错误。