Golang 字符串与日期互转 + 服务器时区问题

日期转字符串

// 格式化
// golang中格式不是‘yyyy-MM-dd HH:mm:ss’,而是采用golang诞生时间作为格式
t = "2006-01-02 15:04:05" 
time := time.Now()
fmt.Println(time.Format(t))

详细链接:https://www.jianshu.com/p/d853d1d42076


字符串转日期

golang默认采用UTC,即Unix标准时间。而一般情况下,我们存数据库采用的是中国时间,即CST。
UTC和CST一般相差8个小时。

time := time.Now()
// 默认UTC    
loc, err := time.LoadLocation("") 
// 一般为CST
loc, err := time.LoadLocation("Local")
// 美国洛杉矶PDT
loc, err := time.LoadLocation("America/Los_Angeles")
// CST
loc, _:= time.LoadLocation("Asia/Chongqing") 

将string类型直接转换成对应时区time

loc, err := time.LoadLocation("Local")
dt, err := time.ParseInLocation("2006-01-02 15:04:05", "2017-05-11 14:06:06", loc)

原文链接:https://blog.csdn.net/hehexiaoxia/article/details/71629225


时区报错问题

报错1

panic: time: missing Location in call to Time.In

环境

1、docker 空镜像(或类似环境)
2、Go 应用中 使用了 loc, _ := time.LoadLocation(“Asia/Chongqing”)

原因

时间的位置信息是从本地文件系统中提取的,大多数系统都支持它,但还是取决于当前系统。具体的配置存储路径:
$ cd /usr/share/zoneinfo

进入该目录就可以看到各时区的配置信息

$ ls

+VERSION    Australia   EET         Factory     Greenwich   Jamaica     Mexico      Poland      US          posixrules
Africa      Brazil      EST         GB          HST         Japan       NZ          Portugal    UTC         zone.tab
America     CET         EST5EDT     GB-Eire     Hongkong    Kwajalein   NZ-CHAT     ROC         Universal
Antarctica  CST6CDT     Egypt       GMT         Iceland     Libya       Navajo      ROK         W-SU
Arctic      Canada      Eire        GMT+0       Indian      MET         PRC         Singapore   WET
Asia        Chile       Etc         GMT-0       Iran        MST         PST8PDT     Turkey      Zulu
Atlantic    Cuba        Europe      GMT0        Israel      MST7MDT     Pacific     UCT         iso3166.tab

但在空镜像(或类似的场景)中就不存在这些时区配置文件,程序引用时就会出现这个报错(准确来说,出现这个问题是因为本地系统不存在 Asia/Chongqing 的时区配置文件)

解决

安装

$ apk add --no-cache tzdata

安装这个包后,会在 /usr/share/zoneinfo 目录下生成各时区的配置信息。注意,如果没有 timezone 、locatime 的配置,需要手动处理一下

报错2

panic: time: missing Location in call to Date

出现这个问题一般是使用了time.LoadLocation,它依赖于 IANA Time Zone Database (简称 tzdata 吧) ,一般linux系统都带了,但是有的windows系统没带。

引用LoadLocation方法前使用加上一句 os.Setenv(“ZONEINFO”, ‘xx/xx/data.zip’)

// rootPath is the workdir or some absolute path
os.Setenv("ZONEINFO", 'xx/xx/data.zip')
l, _ := time.LoadLocation("Asia/Shanghai")
fmt.Println(time.Now().In(l)) // 2019-05-17 15:57:43.0785088 +0800 CST 

data.zip文件在github可以找到:https://github.com/lesroad/tzdata

猜你喜欢

转载自blog.csdn.net/QiuHaoqian/article/details/107972094