Time

time 包中对 Time 的定义:

  1. type Time struct {
  2. // wall:表示距离公元 1 年 1 月 1 日 00:00:00UTC 的秒数;
  3. wall uint64
  4. // ext:表示纳秒;
  5. ext int64
  6. // loc:代表时区,主要处理偏移量,不同的时区,对应的时间不一样。
  7. loc *Location
  8. }

时间的获取

now

  1. now := time.Now() //返回当前时间的Time
  2. fmt.Printf("current time:%v\n", now)
  3. year := now.Year() //年
  4. month := now.Month() //月
  5. day := now.Day() //日
  6. hour := now.Hour() //小时
  7. minute := now.Minute() //分钟
  8. second := now.Second() //秒
  9. fmt.Printf("%d-%02d-%02d %02d:%02d:%02d\n", year, month, day, hour, minute, second)
  10. // log
  11. current time:2019-12-12 12:33:19.4712277 +0800 CST m=+0.006980401
  12. 2019-12-12 12:33:19

unix

时间戳是自 1970 年 1 月 1 日(08:00:00GMT)至当前时间的总毫秒数,它也被称为 Unix 时间戳(UnixTimestamp)。

  1. now := time.Now() //获取当前时间
  2. timestamp10 := now.Unix() //秒时间戳(10位)
  3. timestamp13 := now.UnixNano() / 1e6 //毫秒时间戳(13位)

unix to Time

使用 time.Unix() 函数可以将时间戳转为时间格式。

  1. func main() {
  2. now := time.Now() //获取当前时间
  3. timestamp := now.Unix() //时间戳
  4. timeObj := time.Unix(timestamp, 0) //将时间戳转为时间格式
  5. fmt.Println(timeObj)
  6. year := timeObj.Year() //年
  7. month := timeObj.Month() //月
  8. day := timeObj.Day() //日
  9. hour := timeObj.Hour() //小时
  10. minute := timeObj.Minute() //分钟
  11. second := timeObj.Second() //秒
  12. fmt.Printf("%d-%02d-%02d %02d:%02d:%02d\n", year, month, day, hour, minute, second)
  13. }
  14. // log
  15. 2019-12-12 13:24:09 +0800 CST
  16. 2019-12-12 13:24:09

解析

Format

Time 类型有一个自带的 Format 方法进行格式化。

需要注意的是Go语言中格式化时间模板不是常见的Y-m-d H:M:S而是使用Go语言的诞生时间 2006 年 1 月 2 号 15 点 04 分 05 秒。

  1. func main() {
  2. now := time.Now()
  3. // 24小时制
  4. fmt.Println(now.Format("2006-01-02 15:04:05.000 Mon Jan"))
  5. fmt.Println(now.Format("2006-01-02 15:04:05"))
  6. // 12小时制
  7. fmt.Println(now.Format("2006-01-02 03:04:05.000 PM Mon Jan"))
  8. fmt.Println(now.Format("2006/01/02 15:04"))
  9. fmt.Println(now.Format("15:04 2006/01/02"))
  10. fmt.Println(now.Format("2006/01/02"))
  11. }
  12. // log
  13. 2019-12-12 15:20:52.037 Thu Dec
  14. 2019-12-12 15:20:52
  15. 2019-12-12 03:20:52.037 PM Thu Dec
  16. 2019/12/12 15:20
  17. 15:20 2019/12/12
  18. 2019/12/12

Parse

解析一个格式化的时间字符串并返回它代表的时间

  1. func Parse(layout, value string) (Time, error)
  2. func ParseInLocation(layout, value string, loc *Location) (Time, error)

ParseInLocation 与 Parse 函数类似,但有两个重要的不同之处:

  1. 当缺少时区信息时,Parse 将时间解释为 UTC 时间,而 ParseInLocation 将返回值的 Location 设置为 loc。
  2. 第二,当时间字符串提供了时区偏移量信息时,Parse 会尝试去匹配本地时区,而 ParseInLocation 会去匹配 loc。
    1. func main() {
    2. var layout string = "2006-01-02 15:04:05"
    3. var timeStr string = "2019-12-12 15:22:12"
    4. timeObj1, _ := time.Parse(layout, timeStr)
    5. fmt.Println(timeObj1)
    6. timeObj2, _ := time.ParseInLocation(layout, timeStr, time.Local)
    7. fmt.Println(timeObj2)
    8. }
    9. // log
    10. 2019-12-12 15:22:12 +0000 UTC
    11. 2019-12-12 15:22:12 +0800 CST


操作函数

Add

某个时间 + 时间间隔

  1. func (t Time) Add(d Duration) Time

Sub

返回一个 t - u 的时间差值。
如果结果超出了 Duration 可以表示的最大值或最小值,将返回最大值或最小值。

要获取时间点 t - d(d 为 Duration),可以使用 t.Add(-d)

  1. func (t Time) Sub(u Time) Duration

Equal

判断两个时间是否相同。

该函数会考虑时区的影响,因此不同时区标准的时间也可以正确比较,Equal 方法和用 t==u 不同,Equal 方法还会比较地点和时区信息。

  1. func (t Time) Equal(u Time) bool

Before

判断一个时间点是否在另一个时间点之前:如果 t 代表的时间点在 u 之前,则返回真,否则返回假。

  1. func (t Time) Before(u Time) bool

After

判断一个时间点是否在另一个时间点之后:如果 t 代表的时间点在 u 之后,则返回真,否则返回假。

  1. func (t Time) After(u Time) bool