Go time包

21 阅读3分钟

简介

在项目中不可避免的需要和时间打交道,比如说时间的显示、时间间隔、定时器、时区等;通过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))
}