Go 标准库 time 包之 Duration 类型
从前面章节中我们知道,Time 类型表示的是某个瞬间,或者说某个时刻,比如现在的 2018 年 8 月 28 日 20:45:50 秒。如果要表示持续时间,那么就必须要用到 Duration 这个类型。
Duration 类型
Duration 类型用于表示两个时刻 ( Time ) 之间经过的时间,以 纳秒 ( ns ) 为单位。
1 纳秒等于一秒的十亿分之一,即等于 10 的负 9 次方秒 ( 1 ns = 10-9 s)
我们先看看看 Duration 类型的定义
type Duration int64
从定义上可以知道,Duration 结构其实是 int64 的别名,这样能表示的持续时间大概是 299 年
package main const INT64_MAX = 1<<63 - 1 func main() { println("Duration 能表示的持续时间的最大值为:") println(INT64_MAX / (1000000000 * 86400 * 365)) }
输出结果为
Duration 能表示的持续时间的最大值为: 292
范例
下面的范例演示了如何使用 Go 语言计算两个时间的间隔
package main import ( "fmt" "time" ) const UINT32_MAX uint32 = ^uint32(0) func main() { var i uint32 t0 := time.Now() // 空循环 uint32 的最大值次数 for i = 0; i < UINT32_MAX; i += 1 { } t1 := time.Now() fmt.Printf("The loop took %v to run.\n", t1.Sub(t0)) }
运行结果如下
The loop took 2.279989986s to run.
Duration 类型方法
下表列出了 Duration 类型的方法
| 方法 | 说明 | 
|---|---|
| Hours() float64 | 返回持续时间 d 是 小时的多少倍 | 
| Minutes() float64 | 返回持续时间 d 是 1 分钟 ( 60 秒 ) 的多少倍 | 
| Nanoseconds() int64 | 返回持续时间 d 是 1 纳秒的多少倍 | 
| Round(m Duration) Duration | 采用四舍五入的方式返回一个持续时间 d 是另一个持续时间 m 的多少倍 ,如果 m 小于 0 ,则直接返回原值 | 
| Seconds() float64 | 返回持续时间 d 是 1 秒的多少倍 | 
| String() string | 以 「 72h3m0.5s 」的格式返回持续时间 d 的字符串表现形式 | 
| Truncate(m Duration) Duration | 返回一个持续时间 d 是另一个持续时间 m 的多少倍,如果 m 小于 0 ,则直接返回原值 | 
Duration 的构造方法
除了 Duration 自身的两个方法 Truncate() 和 Round() 能够生成一个新的 Duration 对象外,time 包还提供了额外的三个方法从时刻 Time 中创建 Duration 对象
| 方法 | 说明 | 
|---|---|
| ParseDuration(s string) (Duration, error) | 将一个 「 72h3m0.5s 」格式的字符串转换为一个 Duration 对象 | 
| Since(t Time) Duration | 返回一个时刻 ( Time t ) 到当前时间所经过的持续时间 | 
| Until(t Time) Duration | 返回当前时间到另一个时刻 ( Time t ) 需要经过的持续时间 | 
结束语
其实,还好,Duration 还是比较好理解的。关于方法的更多说明,我会在将所有的类型解释完毕后,一一完善,尤其是它们的范例