简介
在项目中不可避免的需要和时间打交道,比如说时间的显示、时间间隔、定时器、时区等;通过time包可以满足我们平常需要的业务功能。
示例
等待时间
如等待1秒,注意此处的入参要接单位,不能直接time.Sleep(1)。
time.Sleep(1 * time.Second)
可用的时间单位定义如下:
const (
// 纳秒
Nanosecond Duration = 1
// 微秒
Microsecond = 1000 * Nanosecond
// 毫秒
Millisecond = 1000 * Microsecond
// 秒
Second = 1000 * Millisecond
// 分钟
Minute = 60 * Second
// 小时
Hour = 60 * Minute
)
格式化时间
这个地方有一个特别需要注意的地方,就是必须按2006年1月2日3点4分5秒这个时间来定义,写成其他的时间是会导致格式化失败,可以选择自己需要的时间格式。
打印当前时间,按照DateTime
的格式,结果如2024-03-20 10:26:26
fmt.Println(time.Now().Format(time.DateTime))
可用的格式样式定义如下:
const (
Layout = "01/02 03:04:05PM '06 -0700" // The reference time, in numerical order.
ANSIC = "Mon Jan _2 15:04:05 2006"
UnixDate = "Mon Jan _2 15:04:05 MST 2006"
RubyDate = "Mon Jan 02 15:04:05 -0700 2006"
RFC822 = "02 Jan 06 15:04 MST"
RFC822Z = "02 Jan 06 15:04 -0700" // RFC822 with numeric zone
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" // RFC1123 with numeric zone
RFC3339 = "2006-01-02T15:04:05Z07:00"
RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
Kitchen = "3:04PM"
// Handy time stamps.
Stamp = "Jan _2 15:04:05"
StampMilli = "Jan _2 15:04:05.000"
StampMicro = "Jan _2 15:04:05.000000"
StampNano = "Jan _2 15:04:05.000000000"
DateTime = "2006-01-02 15:04:05"
DateOnly = "2006-01-02"
TimeOnly = "15:04:05"
)
时间间隔
通过time.Add()方法来指定时间间隔。
start = 2009-01-01 12:00:00 +0000 UTC
start.Add(time.Second * 10) = 2009-01-01 12:00:10 +0000 UTC
start.Add(time.Minute * 10) = 2009-01-01 12:10:00 +0000 UTC
start.Add(time.Hour * 10) = 2009-01-01 22:00:00 +0000 UTC
start.Add(time.Hour * 24 * 10) = 2009-01-11 12:00:00 +0000 UTC
计算时间间隔示例代码如下:
package main
import (
"fmt"
"time"
)
func main() {
start := time.Date(2009, 1, 1, 12, 0, 0, 0, time.UTC)
afterTenSeconds := start.Add(time.Second * 10)
afterTenMinutes := start.Add(time.Minute * 10)
afterTenHours := start.Add(time.Hour * 10)
afterTenDays := start.Add(time.Hour * 24 * 10)
fmt.Printf("start = %v\n", start)
fmt.Printf("start.Add(time.Second * 10) = %v\n", afterTenSeconds)
fmt.Printf("start.Add(time.Minute * 10) = %v\n", afterTenMinutes)
fmt.Printf("start.Add(time.Hour * 10) = %v\n", afterTenHours)
fmt.Printf("start.Add(time.Hour * 24 * 10) = %v\n", afterTenDays)
}
定时器
如设置一个1秒的定时器,到达定时后,会把当前时间发送到ticker的通道。
ticker := time.NewTicker(time.Second)
每秒打印当前时间示例如下:
package main
import (
"fmt"
"time"
)
func main() {
ticker := time.NewTicker(time.Second)
defer ticker.Stop()
for {
select {
case t := <-ticker.C:
fmt.Println("Current time: ", t)
}
}
}
时区
时区简单理解就是Unix时间戳(1971年1月1日0时0分0秒开始到现在)在不同地区的显示而已。
UTC时间按照东八区显示,即早8个小时,结果为2018-08-30 20:00:00 +0800 CST
。
示例代码如下:
package main
import (
"fmt"
"time"
)
func main() {
location, err := time.LoadLocation("Asia/Shanghai")
if err != nil {
panic(err)
}
timeInUTC := time.Date(2018, 8, 30, 12, 0, 0, 0, time.UTC)
fmt.Println(timeInUTC.In(location))
}