持续创作,加速成长!这是我参与「掘金日新计划 · 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 中可读取每次等待完时的时间点。