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对象。

那么如何在程序中设置时区呢? 这里列举几种方法:

  1. 根据时区的名字加载时区,运行的过程中会去 GOROOT/lib/time/zoneinfo.zip 中查找对应的时区的配置信息,并加载

     location, err := time.LoadLocation("Asia/Shanghai")
    
  2. 根据时间的偏移数据构造一个Location信息,在一些场景下很方便

     bjLocation := time.FixedZone("BeiJing", 8*60*60)
    
  3. 返回当前的时区信息

     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分