一、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类型时需要注意以下几点:
- duration类型只能有一个正负号,即不能存在两个连续的负号。
- duration类型的最大取值不能超过1<<63-1,如果超过会产生溢出。
- duration类型的精度不能保证完全正确,因此在计算时间时可能会有误差。