在编写程序中,我们经常会遇到时间戳和日期字符串相互转换、获取当前时间、时间之间的比较操作。本文主要介绍golang中关于时间常用的操作。

golang中的时间操作在time包中。时间操作的基础是基于一个Time的结构体。时间相关的操作都需要先转换成Time结构体,再通过Time结构体相关的函数转换成目标值。如下图:

再来看Time结构体在源文件中的定义:

01

获取时间相关操作

1、获取当前时间戳

函数原型:func (t Time) Unix() int64

示例代码:

2、获取当前年月日时分秒和星期几(数字不带前导0)

函数原型:

func (t Time) Date() (year int, month Month, day int)

func (t Time) Clock() (hour, min, sec int)

func (t Time) Hour() int

func (t Time) Minute() int

func (t Time) Second() int

示例代码:

3、获取今天是星期几

函数原型:func (t Time) Weekday() Weekday

该函数返回值类型是Weekday,即可以表示成数字星期几,也可以输出成星期的英文表示。

示例代码:

4、返回当前时间是一年中的第几天

函数原型:func (t Time) YearDay() int

示例代码:

02

时间戳和日期字符串之间的转换

1、时间戳格式化成日期字符串

函数原型:

func Unix(sec int64, nsec int64) Time

func (t Time) Format(layout string) string

该转换主要分三步:

  1. 将时间戳类型转成int64类型
  2. 将int64类型时间戳转换成Time结构
  3. 调用Time结构体的Format函数

示例代码:

2、日期字符串按格式转换成时间戳

函数原型:

func ParseInLocation(layout, value string, loc *Location) (Time, error)

该转换主要分三步:

  1. 调用time.LoadLocation函数,设置特定的时区。否则,在第2步,默认会按UTC时区解析时间。
  2. 调用time.ParseInLocation函数,将字符串转换成Time结构体
  3. 调用Time结构体的Unix函数转换成对应的时间戳

示例代码:

03

时间之间的常用计算操作

这里介绍一个新的数据类型Duration。在time源码包中的定义如下:

Duration,代表的是两个时间点之间的持续时间(纳秒数),即时段。

上文的Time结构体类型,代表的是时刻,即一个时间点。如下图:

Duration = t1 - t2 单位:纳秒

1、计算两个日期之间相差多少秒

该转换主要分三步:

  1. 调用time.LoadLocation函数,设置特定的时区。否则,在第2步,默认会按UTC时区解析时间。
  2. 调用time.ParseInLocation函数,将字符串转换成Time结构体
  3. 调用Time结构体的计算函数Sub,得到两个时间之间的Duration

示例代码:

2、获取从某个时间 至今 经过的时间Duration

函数原型:funcSince(t Time) Duration

场景:假设你和你女朋友相识于2014-10-02 13:14:15,计算出至今你们总共认识了多长时间。示例代码:

3、计算从今天到未来某个时间经过的时间

函数原型:func Until(t Time) Duration

示例代码:

4、时间之间的比较:是早、是晚、还是相等

相关函数:

func (t Time) After(u Time) bool

func (t Time) Before(u Time) bool

func (t Time) Equal(u Time) bool

场景:你和女朋友约会,约好2021-12-12 13:14:15 在餐厅门口见。这时,你看了看手表,在大脑中和约定时间快速的比较了下,判断是来早了还是来晚了

5、计算N天后的时间

函数原型:func (t Time) Add(d Duration) Time

场景:有一天,你女朋友说,3天后去你家里玩。你赶紧在日历上看看3天后的日期,做上了标记。