今天在学习golang的时候,发现golang 在时间方面这块会有很多陷阱。继续在后端学习方面请教同事。先把今天遇到的问题记录下来,以作备日后用。
问题一:数据库mysql 的datetime 插入时区有误差?
起初不留意这个问题,查询了很久一直没发现问题。后来发现数据库链接时间没有加时区。但为什么需要加?先不管那么多,先把时区加上去。
加了时区 parseTime=true&loc=Local
db, err := sql.Open("mysql", "root:@tcp(127.0.0.1:3306)/fangtang?charset=utf8&parseTime=true&loc=Local")
数据库插入的时候,datetime的类型就可以和时区保持一致。问题好像解决了。
问题二,不加时区行不行?为什么time.Now 打印出来是对的,插入的时候不对
同事做了一次实验处理。在数据库插入的时候,将时间格式化一次,可以顺利插入mysql里面去。时区没有问题。datetime的字段可以接收字符串形式。
now := time.Now().Format("2006-01-02 15:04:05")
fmt.Println("SH : ",now)// 2018-05-31 22:58:13
出现问题的做法,直接将time的结构体插入到数据库,出现的现象是mysql的datetime字段插入的时间会有8个小时差别。解决方法先采取了format时间再直接插入数据库。
另外一种做法是将时区额外补上。但这种做法不如对mysql链接加上 parseTime=true&loc=Local” 两个变量快捷。
其他问题记录
今天记录一下几个有意思的地方。
格式化用到时间点:2006-01-02 15:04:05 // 记忆方法612345,谷歌go的创世日,挺有意思。
now.Format(“2006-01-02 15:04:05”)
精确到毫秒时候,还需要对此日期动刀一下,调整 。2006-01-02 15:04:05.000
now := time.Now()
//now.Format("2006-01-02 15:04:05")
var zone= time.FixedZone("CST", 8*3600)
//var cstSh, _ = time.LoadLocation("Asia/Shanghai")
now.In(zone) //修正时区问题
接触time 后, 还有UTC 和 UTC 这些需要注意区别。time里面还有隐藏很多方法,还需要继续接触。
package main
import (
"fmt"
"time"
)
func main(){
now := time.Now().Format("2006-01-02 15:04:05") //格式化时间
curtime := time.Now() //本地时间
fmt.Println(curtime)
fmt.Println( time.Now().Unix()) //时间戳
fmt.Println("SH : ",now)
}
总的来讲,golang 还是比较难学一门语言。 后面还要学好多关于后端的方面知识。对一直学前端的人来讲,这块是很需要耐性。