[Go 入门] 第二十二章 Go 语言时间编程
Go 入门系列参考于互联网资料与 人民邮电出版社 《Go 语言入门经典》 与 《Effective Go》,编写目的在于学习交流,如有侵权,请联系删除
本文内容:
时间元素编程
时间是一个重要的编程元素,可用于计算、同步服务器以及测量。Go 语言标准库提供了 time
包,其中包含用于同当前时间交互以及测量时间的函数和方法
在编程中,时间通常被成为“实时”、“过去的时间”和“壁挂钟”。对于术语“壁挂钟”,可将其视为挂在墙上的时钟。它显示的时间随时区或地区性调整而异,但每隔 24h 显示的时间都相同。对编程来说,这种随时区、地区性调整而异的二十四小时制并不理想,因此也存在单调时钟(monotonic clock)的概念。单调时钟以固定的方式度量时间,可用于可靠地度量事件发生的时间
要使用 Go 语言打印计算中的当前的时间,可使用函数 Now
1 |
|
随后执行输出:
1 |
|
根据计算机地区的设置,看到的打印出来的时间格式可能不同
网络时间协议 (Network Time Protocol, NTP)是一种在整个网络中同步时间的网络协议,使用 NTP 的不同计算机更有可能就时间达成一致,但在本地它们依然可以设置成不同的时区
在计算机中,要消除时区的影响,可参照世界标准时间 (Coordinated Universal Time, UTC)。UTC 是时间标准而非时区,它让不同地区的计算机有相同的参照物,而不用考虑相对时区
让程序休眠
知道时间编程的复杂性后,该让程序休眠了。在计算程序中,休眠意味着暂停执行程序。在休眠期间,程序什么都不做。在 Go 语言中,如果 Goroutine 处于休眠状态,则程序的其他部分可继续执行。
1 |
|
为了让程序暂停执行一会儿,休眠是很有用的。可通过休眠来等待其他执行任务完成或让程序暂停执行。但除非只是想让程序暂停一会,否则使用 Goroutine 来管理执流程是更佳的选择
设置超时时间
要在特定的时间过后执行某项操作,可使用函数 After
1 |
|
使用 ticker
使用 ticker 可让代码每隔特定的时间就重复执行一次。需要在很长的时间内,定期执行任务时,这么做很有用
1 |
|
执行后将每 5s 输出当前的时间:
1 |
|
以字符串格式表示时间
时间的字符串表示:
类型 | 字符串 |
---|---|
ANSIC | MON Jan _2 15:04:05 2006 |
UnixDate | MON Jan _2 15:04:05 MST 2006 |
RubyDate | MON Jan _2 15:04:05 -0700 2006 |
RFC822 | 02 Jan 06 15:04 MST |
RFC822Z | 02 Jan 06 15:04 -0700 |
RFC850 | Monday, 02-Jan-06 15:04:05 MST |
RFC1123 | Mon, 02 Jan 2006 15:04:05 MST |
RFC1123Z | Mon, 02 Jan 2006 15:04:05 -0700 |
RFC3339 | 2006-01-02T15:04:05Z07:00 |
RFC3339Nano | 2006-01-02T15:04:05.999999999Z07:00 |
通常,使用上述标准将日期储存在数据库中,并以字符串的方式提供它们。 Go 语言支持时间标准,也支持定义不符合这些标准的时间格式
1 |
|
上述代码将一个 RFC3339Nano 格式的时间字符串传递给了结构体 Time, 再将这个结构体打印到终端
2006-01-02 15:04:05.999999999 +0000 UTC
使用结构体 Time
1 |
|
执行后将会输出:
1 |
|
时间加减
方法 Add
在既有时间的基础上加上一定时间,可将其结果赋给变量
1 |
|
方法 Sub
从既有时间中减去指定的时间,也可以将其结果赋给变量
1 |
|
比较两个不同的 Time 结构体
time
包提供了方法 Before
、After
和Equal
,这些方法来比较两个时间结构体,并返回一个布尔值
1 |
|
运行上述代码,将输出:1
2
3true
false
false
问题列表
该使用那种时间格式
UTC 使用的是 ISO 8601 格式,这种格式在网上得到了很好的支持,RFC3339 是一个 ISO 8601 扩展,这两种标准都是不错的选择,如果有疑问,可使用得到广泛支持的 ISO 8601 标准
该将 UTC 还是 GMT 作为网络时间
当前,计算机和互联网都使用标准 UTC。GMT 实际上是一个时区,时区会时间调整的影响,而时间标准不会
All articles in this blog adopt the CC BY-SA 4.0 agreement unless otherwise stated. Please indicate the source for reprinting!