这是我参与「第五届青训营 」伴学笔记创作活动的第 13 天
每次看到 Go 的古怪玩法都有些难受,为什么他要设计一些稀奇古怪的玩法(其实关键是它独立特行,偏偏没有提供真正的便利)。比如说Go语言的时间格式化以及它的时区,在开发中,不可避免地,我们需要和时间格式化操作打交道。在别的语言中,字符串格式化基本是通用的,也就是那一套 "yyyy" 的格式,虽然说不上方便,但是基本上已经是属于标准了,大多数情况下放之四海而皆准。而go中却古怪的很是一个具体的日期 "2006-01-02 15:04:05"。
根据Go官方开发人员的说法,这个是有来源的,它的完整版是下面这样的:
"Mon Jan 2 15:04:05 -0700 MST 2006"
也就是所谓的星期一,一月二日,下午三点过四分五秒,年份是2006年。 那个-0700是时区和格林尼治时间的差值,MST是时区的缩写。 不过星期和月份其实也是可以使用先前我们的那个字符串一样使用数字的。这个go的解析器就是根据确定的数字确定某一部分表示什么内容的。比如说,time.time这个包直接输出时间的时候就是类型下面这种格式的:
"2006-01-02 15:04:05.999999999 -0700 MST"
比如在中国,它的答应出来是类型下面这样的:
"2018-01-02 15:04:05.999999999 +0800 CST"
CST是中国标准时间的缩写 china standard time。
时区
时间的类型里其实包含了一个location的类型,这个类型就是时区的类型。在go中,默认是按照当前机器上的时区来进行的。 如果需要将时区转换到其他的时区可以使用如下的方法,假设以转换到东京的时区为例:
loc, _ := time.LoadLocation("Asia/Tokyo")
t := time.Now().In(loc)
通过在一个时间上调用In方法,就可以将这个时间转换到指定的时区。 当有时候需要强制统一到某一个具体的时区的时候,可以使用如下的方法: (以 UTC 时间为例)
time.Local = time.UTC