Go 语言 time 包详解

229 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第34天,点击查看活动详情

不管学习哪种语言,一个绕不开的数据类型就是时间,在我们学习工作的过程中,这也是我们常常会使用到的,Go 语言自带的 time 包封装了常用的时间类型方法,本文与大家一起梳理一下。

1. 从 time.Now() 开始

time.Now() 会返回一个如下的时间信息:

2022-06-30 01:02:02.427219 +0800 CST m=+0.001904709

在打印出的时间信息中,我们能详细的看到年月日以及时区信息,然而很多时候,我们并不需要这么详细的信息,所以我们可以通过以下的方法来截取自己想要的信息:

    now := time.Now()
    year := now.Year()     //年
    month := now.Month()   //月
    day := now.Day()       //日
    hour := now.Hour()     //小时
    minute := now.Minute() //分钟
    second := now.Second() //秒

2. 时间戳

时间戳是一个非常重要的概念,因为数据库中一般储存的都是时间戳。

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

Go 提供了如下两个命令,返回秒级的时间戳或者毫秒级的时间戳:

now := time.Now()
now.Unix() // 秒级的时间戳 1656522604
now.UnixMilli() // 毫秒级的时间戳 1656522604374
now.UnixMicro // 微秒级的时间戳 1656522604374374

3. 时间格式化

Format()方法可以方便地帮助我们格式化时间:

    now := time.Now()
    // 24小时制
    now.Format("2006-01-02 15:04:05.000 Mon Jan")
    // 12小时制
    now.Format("2006-01-02 03:04:05.000 PM Mon Jan")
    now.Format("2006/01/02 15:04")
    now.Format("15:04 2006/01/02")
    now.Format("2006/01/02")

4. 时间计算

  • a.Add(b) a加上b时间间隔的时间
  • a.Sub(b) b到a所需的时间
  • a.Equal(b) 自动进行时区转化判断是否相同
  • a.Before(b) a是否早于b
  • a.After(b) a是否晚于b

5. time.tick() 与 time.After()

在 golang 中,After(d) 是只等待一次 d 的时长,并在这次等待结束后将当前时间发送到通道。Tick(d) 则是间隔地多次等待,每次等待 d 时长,并在每次间隔结束的时候将当前时间发送到通道。

因为 Tick() 也是在等待结束的时候发送数据到通道,所以它的返回值是一个 channel,从这个 channel 中可读取每次等待完时的时间点。