您的位置:

Go时间包中的duration类型详解

一、duration的基本概念

duration是Go语言中表示时间段的类型,它是int64类型的别名。在Go语言中,时间处理是比较重要的,因为很多情况下我们都需要和时间打交道。duration类型可以表示一段时间,比如1小时30分钟,可以用time.Hour*1+time.Minute*30来表示。duration类型的单位是纳秒,可以使用time包中的常量来表示不同的时间段。

// 常用的时间段
const (
    Nanosecond  Duration = 1
    Microsecond          = 1000 * Nanosecond
    Millisecond          = 1000 * Microsecond
    Second               = 1000 * Millisecond
    Minute               = 60 * Second
    Hour                 = 60 * Minute
)

二、duration的使用方法

duration类型可以通过代表整数的字符串进行解析,例如"2h30m"的字符串表示2小时30分的时间段,可以使用ParseDuration方法将其解析成duration类型

package main

import (
	"fmt"
	"time"
)

func main() {
	duration, err := time.ParseDuration("2h30m")
	fmt.Println(duration, err)
}

输出:

2h30m0s <nil>

duration类型可以进行加减操作,在时间处理中非常常见,例如我们可以用Add或者Sub方法对时间进行操作:

package main

import (
	"fmt"
	"time"
)

func main() {
	now := time.Now()
	expiration := now.Add(time.Hour * 24)
	fmt.Println(expiration.Sub(now))
}

输出:

24h0m0s

三、duration的单位转换

duration类型可以转换为其他时间单位,例如分钟、小时等。可以使用duration类型的Seconds方法获得秒数,然后再根据自己的需要转换为其他时间单位。例如:

package main

import (
	"fmt"
	"time"
)

func main() {
	duration := time.Hour + time.Minute*30
	fmt.Println(int(duration.Seconds() / 60)) // 转换为分钟
	fmt.Println(duration.Hours())             // 转换为小时
}

输出:

90
1.5

四、duration与ticker定时器的使用

duration类型可以与ticker定时器一起使用,可以在指定的时间内执行某些操作,例如定时执行某个任务。例如:

package main

import (
	"fmt"
	"time"
)

func main() {
	ticker := time.NewTicker(2 * time.Second)
	go func() {
		for t := range ticker.C{
			fmt.Println("Tick at ", t)
		}
	}()

	time.Sleep(10 * time.Second)
	ticker.Stop()
	fmt.Println("Ticker stopped")
}

输出:

Tick at  2021-06-17 21:58:51.9558865 +0800 CST m=+2.002681801
Tick at  2021-06-17 21:58:53.9559934 +0800 CST m=+4.002748701
Tick at  2021-06-17 21:58:55.9561261 +0800 CST m=+6.002861401
Tick at  2021-06-17 21:58:57.9562236 +0800 CST m=+8.003938001
Tick at  2021-06-17 21:58:59.9563296 +0800 CST m=+10.004023801
Ticker stopped

五、duration与sleep的使用

duration类型可以与sleep一起使用,可以让程序在指定的时间内睡眠。sleep的时间应该使用duration类型表示。

package main

import (
	"fmt"
	"time"
)

func main() {
	fmt.Println("Sleep 5 seconds")
	time.Sleep(5 * time.Second)
	fmt.Println("Wake up")
}

输出:

Sleep 5 seconds
Wake up

六、duration的注意事项

在使用duration类型时需要注意以下几点:

  1. duration类型只能有一个正负号,即不能存在两个连续的负号。
  2. duration类型的最大取值不能超过1<<63-1,如果超过会产生溢出。
  3. duration类型的精度不能保证完全正确,因此在计算时间时可能会有误差。