golang中对时间的处理整理
最近开始使用go进行后台开发,其中遇上比较多的问题是对时间的处理,这中间涉及到时间格式的转换,时区的转换等等。golang提供了time模块,整体处理起来比较简单,但是还有一些需要注意的地方,这里做一个整理。
时间格式的转换
说到golang的时间格式不得不说她奇葩的时间格式化参数,和其他编程语言使用 Y-m-d 等符号表示时间格式不同,golang使用 2006表示完整的年, 06则表示两位格式的年,比喻19这种。使用 5 或者 05 表示一分钟的第几秒。 详细的表格如下:
格式字符 | 含义 |
---|---|
1 | 表示数字的第几个月份(01表示带前导0的月份) |
2 | 表示一个月中的第几天 |
3 | 表示第几个小时 |
4 | 表示一个小时的第几分钟 |
5 | 表示一分钟的第几秒 |
6 | 表示年份 |
7 | 表示时区信息 |
字符串到时间的转换:
timeStr := "2019-03-04 16:49:05"
datetime, err := time.Parse("2006-01-02 15:04:05", timeStr)
时间到字符串的转换:
对于将时间转换成一个字符串,golang的time库提供了Format函数,使用方法很简单,在format中指定输出的格式就可以了。
time.Now().Format("2006-01-02 15:04:05")
这段代码则会将当前的时间转成 年-月-日 时:分:秒
的格式输出
时间戳转成时间:
time库中的提供了Unix函数将unix的时间戳转成golang中的time对象
Now := time.Unix(1551690325 ,0)
从时间对象中获取时间戳:
time库中的time结构中提供了Unix()函数返回从1970年开始至今的秒数。
time.Now().Unix()
时区相关的处理
在上面的介绍中并没有涉及到时区相关的处理,实际在开发中由于涉及到多种时间函数的调用处理,如果忽略时区的处理,往往会导致程序出现bug。 比喻下面的函数。
time.Now() 返回的是当前的本地时间,已经包含了时区的信息了。
time.Parse() 解析到的时间,如果没有指定时区信息,则解析到的时间会变成UTC的
time.ParseInLocation() 如果原始的时间字符串中没有时区信息,则可以传入一个参数来指定时区信息,并将时间字符串解析成 time对象。
那么如何在程序中设置时区呢? 这里列举几种方法:
根据时区的名字加载时区,运行的过程中会去
GOROOT/lib/time/zoneinfo.zip
中查找对应的时区的配置信息,并加载location, err := time.LoadLocation("Asia/Shanghai")
根据时间的偏移数据构造一个Location信息,在一些场景下很方便
bjLocation := time.FixedZone("BeiJing", 8*60*60)
返回当前的时区信息
currLocation := time.Now().Location()
这里列举一个简单的使用案例(我当前的时区是东8区):
package main
import (
"fmt"
"time"
)
func main() {
timeStr := "2019-03-04 19:36:42" // 没有带时区信息的时间字符串
rawTime, err1 := time.Parse("2006-01-02 15:04:05", timeStr) // 解析完得到的时间是一个UTC时间
currLoc := time.Now().Location() // 获取当前的时区信息
locTime, err2 := time.ParseInLocation("2006-01-02 15:04:05", timeStr, currLoc) // 将时间解析到当前时区
fmt.Printf("rawTime:%v, err:%v \n", rawTime, err1)
fmt.Printf("locTime:%v, err:%v \n", locTime, err2)
}
程序的输出如下:
rawTime:2019-03-04 19:36:42 +0000 UTC, err:<nil>
locTime:2019-03-04 19:36:42 +0800 CST, err:<nil>
发表于: 2019年3月11日 5时16分