go如何操作mysql中的datetime类型

最近项目中用到了关于数据库中存取时间类型的字段,于是我百度了一下在go语言中与mysql中相匹配的字段类型,很容易我查到了time.Time与mysql中的datetime相对应,毫不犹豫的就是用了,代码中我是这样写的

type UserLend struct {
    UserID     string    `json:"userID"`
    Bookcode   string    `json:"bookcode"`
    Lenddate   time.Time `json:"lenddate"`
    Returndate time.Time `json:"returndate"`
    Status     int       `json:"status"`
    Bookisbn   string    `json:"bookisbn"`
}

那么怎么获取到该字段呢?
我想既然可以直接匹配那打印起来也应该没啥问题(我觉得会自动赋值到time.Time类型),于是我这样写:

var oldlenddate time.Time
d.QueryRow("select lenddate from lendbook where userid=? and bookcode = ?", userid, code).Scan(&oldlenddate)
fmt.Println(oldlenddate)

输出结果是这样的:

0001-01-01 00:00:00 +0000 UTC

然后我百度了一下,果然大家都遇到了这个问题
原因是因为对于_datetime_ 默认会_使用_UTC时间,然后如果说需要获得中国的时间
只需要在打开数据库的时候加上

charset=utf8&loc=Asia%2FShanghai&parseTime=true

果然最终可以实现成功获取了结果是这样

2019-06-11 11:56:58 +0800 CST

最后补充一点关于time.Time的知识:
**
在time包中有这样一个结构体:

type Location struct {
    // 内含隐藏或非导出字段
}

Location代表一个(关联到某个时间点的)地点,以及该地点所在的时区。

var Local *Location = &localLoc

Local代表系统本地,对应本地时区。

var UTC *Location = &utcLoc

UTC代表通用协调时间,对应零时区。

func LoadLocation

func LoadLocation(name string) (*Location, error)

LoadLocation返回使用给定的名字创建的Location。
如果name是""或"UTC",返回UTC;如果name是"Local",返回Local;否则name应该是IANA时区数据库里有记录的地点名(该数据库记录了地点和对应的时区),如"America/New_York"。
LoadLocation函数需要的时区数据库可能不是所有系统都提供,特别是非Unix系统。此时LoadLocation会查找环境变量ZONEINFO指定目录或解压该变量指定的zip文件(如果有该环境变量);然后查找Unix系统的惯例时区数据安装位置,最后查找$GOROOT/lib/time/zoneinfo.zip。

Last modification:June 14th, 2019 at 03:37 pm
如果觉得我的文章对你有用,请随意赞赏