go time 包

时间概念

时间对所有程序语言来说原理都是一样的:时间点、时间段、时区和显示格式。

  • 时间点:时间点没有时区差异,也就是说全世界无论哪个时区都是同一个时间点,时间戳就是时间点的表达方式,所以时间戳没有时区差异。
  • 时间段:时间段其实就是一个整数型,从小到大依次是皮秒(ps)、纳秒(ns)、微秒(μs)、毫秒(ms)、秒(s),在 go 程序中 1s == 1e9。
  • 时区:时间点有时区差异,同一个时间戳在不同时区具有时差区别。
  • 显示格式:这部分没有逻辑问题,纯粹是视图显示。

time 包使用

  1. time.Time:它封装了时间点和时区
type Time struct {
	// 时间点的实现
	wall uint64
	ext  int64
	// 时区的实现
	loc *Location
}

所以,可以对时间点进行的操作包括(不限于):

  • 取得时间点,Now() 返回 Time,其实它是有时区的;Unix() 返回整数型,没有时区概念;
  • 加减时间段 Add(时间段),可以使用正负;
  • 减时间点算时间差 Sub(时间点)、After(时间点)、Before(时间点)、Equal(时间点),注意没有加时间点的方法;另外还提供了 Since(时间点)、Until(时间点) 等函数对参数时间点和当前时间点做减法运算;
  • 设置时区,默认是 local,UTC() 和 In() 等都是设置时区的。
  1. 定时相关的接口和函数
  • Timer 接口,包含有 Stop()、Reset() 方法,包含的函数有 After(),返回通道(阻塞),所以无法提前停止;AfterFunc() ,返回 Timer,后期可以用 Stop() 提前停止;还有 NewTimer() 函数也是返回 Timer,故也可以提前停止;
  • Ticker 接口,也是包含有 Stop() 方法,包含有函数有 Tick() 和 NewTicker(),前者返回通道(阻塞),无法提前停止,如果需要提前停止,只能调用后者,因为它返回 Ticker。
  1. 时间段的操作比较简单,暂不举例。

  2. 格式化的操作也比较简单,暂不举例。