time.ParseDuration函数介绍
time.ParseDuration函数是Go语言中的一个时间函数,可以将字符串解析为时间间隔的值。
函数签名
func ParseDuration(str string) (Duration, error)
解析规则
time.ParseDuration函数可以解析的字符串格式包括:
一个十进制数并加上一个时间单位,例如:"300ms"、"-1.5h"、"2h45m"。
以路径相关的形式表示的时间间隔,例如:"5m30s"、"1h/30m"。
支持的时间单位包括:"ns"、"us"、"ms"、"s"、"m"、"h"。
在字符串中,时间单位通常缩写为一个字符,但是可以通过以下方式明确表示:
"ns"表示纳秒
"us"或"μs"表示微秒
"ms"表示毫秒
"s"表示秒
"m"表示分钟
"h"表示小时
正负号用于表示正数或负数。数字部分可以包含小数点。
解析示例
以下代码演示了如何使用time.ParseDuration函数解析时间间隔字符串:
package main
import (
"fmt"
"time"
)
func main() {
durationStrings := []string{
"1s",
"500ms",
"3h30m",
}
for _, durationString := range durationStrings {
duration, err := time.ParseDuration(durationString)
if err != nil {
fmt.Printf("Error parsing duration string %s: %v\n", durationString, err)
continue
}
fmt.Printf("Parsed duration %v from string %s\n", duration, durationString)
}
}
运行输出如下:
Parsed duration 1s from string 1s
Parsed duration 500ms from string 500ms
Parsed duration 3h30m0s from string 3h30m
常见用途
计算时间
time.ParseDuration函数常用于计算时间。例如,在游戏开发中,我们可能需要实现一个特效持续一段时间的效果,可以使用time.ParseDuration函数将持续时间字符串解析成时间间隔,并在循环中计时,当计时器的时间超过持续时间时,停止特效。
package main
import (
"fmt"
"time"
)
func main() {
durationString := "5s"
duration, err := time.ParseDuration(durationString)
if err != nil {
panic(err)
}
startTime := time.Now()
for {
elapsedTime := time.Now().Sub(startTime)
if elapsedTime > duration {
break
}
fmt.Printf("Running effect for %v/%v\n", elapsedTime, duration)
time.Sleep(100 * time.Millisecond)
}
fmt.Println("Effect finished")
}
运行输出如下:
Running effect for 107.4ms/5s
Running effect for 204.7ms/5s
Running effect for 303.7ms/5s
Running effect for 401.1ms/5s
Running effect for 501.8ms/5s
Running effect for 600.5ms/5s
Running effect for 700.1ms/5s
Running effect for 802.3ms/5s
Running effect for 901.6ms/5s
Running effect for 1.0013s/5s
...
Running effect for 4.9989s/5s
Effect finished
定时任务
time.ParseDuration函数也可用于实现定时任务。例如,在服务器端程序中,我们可能需要实现每隔一段时间检查一次数据库并清理过期的数据。在这种情况下,我们可以使用time.ParseDuration函数将时间间隔字符串解析成时间间隔,然后使用time.Tick函数定时执行检查任务。
package main
import (
"fmt"
"time"
)
func main() {
intervalString := "1m"
interval, err := time.ParseDuration(intervalString)
if err != nil {
panic(err)
}
ticker := time.Tick(interval)
for {
select {
case <-ticker:
fmt.Println("Start cleaning up expired data ...")
// TODO: Cleanup expired data from database
fmt.Println("Done")
}
}
}
以上代码会每隔1分钟执行一次定时任务。
总结
time.ParseDuration函数是Go语言中十分实用的时间函数,能够将时间间隔字符串解析成时间间隔的值。它的使用非常灵活,常见用途包括计算时间、实现定时任务等。在开发中,我们可以根据实际需要灵活使用它。