时间。持续时间类型微秒值到毫秒的转换

我正在使用 golang 的 go-ping (https://github.com/sparrc/go-ping)库来进行非特权 ICMP ping。

timeout := time.Second*1000
interval := time.Second
count := 5
host := p.ipAddr
pinger, cmdErr := ping.NewPinger(host)


pinger.Count = count
pinger.Interval = interval
pinger.Timeout = timeout
pinger.SetPrivileged(false)
pinger.Run()
stats := pinger.Statistics()


latency = stats.AvgRtt  // stats.AvgRtt is time.Duration type
jitter = stats.StdDevRtt// stats.StdDevRtt is time.Duration type

通过运行这个程序,我得到了毫秒级的延迟和微秒级的抖动。我希望两者的单位相同,比如说毫秒,所以当我做 jitter = stats.StdDevRtt/1000jitter = jitter/1000(将微秒转换为毫秒)时,我得到的是纳秒级的抖动: (。有没有办法同时获得延迟和抖动的单位毫秒。

150509 次浏览

号码到 time.Duration

time.Duration 是一种以 int64作为其 基础类型的类型,它以纳秒为单位存储持续时间。

如果你知道这个数值,但是你想要的不是纳秒,只需要把你想要的单位乘起来,例如:

d := 100 * time.Microsecond
fmt.Println(d) // Output: 100µs

上面的工作原理是因为 100是一个无类型的 不变,它可以自动转换为 time.Duration,其中有 int64基础类型。

注意,如果将该值作为类型化值,则必须使用显式的 类型转换:

value := 100 // value is of type int


d2 := time.Duration(value) * time.Millisecond
fmt.Println(d2) // Output: 100ms

time.Duration呼叫号码

所以 time.Duration始终是纳秒。例如,如果您需要以毫秒为单位,那么您所需要做的就是将 time.Duration值除以以毫秒为单位的纳秒数:

ms := int64(d2 / time.Millisecond)
fmt.Println("ms:", ms) // Output: ms: 100

其他例子:

fmt.Println("ns:", int64(d2/time.Nanosecond))  // ns: 100000000
fmt.Println("µs:", int64(d2/time.Microsecond)) // µs: 100000
fmt.Println("ms:", int64(d2/time.Millisecond)) // ms: 100

试试 去游乐场上的例子。

如果你的抖动(持续时间)小于你想转换它的单位,你需要使用浮点除法,否则整数除法将被执行,切断分数部分。详情请参阅: 戈兰回合到最近的0.05

在除法之前,将抖动和单位转换为 float64:

d := 61 * time.Microsecond
fmt.Println(d) // Output: 61µs


ms := float64(d) / float64(time.Millisecond)
fmt.Println("ms:", ms) // Output: ms: 0.061

输出(在 去游乐场上尝试) :

61µs
ms: 0.061

latencyjitter变量的类型是 time.Duration,每个 定义的碱基类型是 int64,以纳秒表示。

当你使用打印函数时,类型为 time.DurationString方法被调用,当打印持续时间时,它使用 hsmµn表示法,这里是 String方法的文档:

// String returns a string representing the duration in the form "72h3m0.5s".
// Leading zero units are omitted. As a special case, durations less than one
// second format use a smaller unit (milli-, micro-, or nanoseconds) to ensure
// that the leading digit is non-zero. The zero duration formats as 0s.

time包中有一些预定义的 常数,你可以使用它们将持续时间变量转换成你喜欢的时间单位,例如:

latencyInMicroSeconds := int64(jitter / time.Microsecond)

注意,我们把它转换成了 int类型,因为如果你不这样做,它仍然是 time.Duration类型,并且该类型的值被认为是以纳秒为单位的,但是现在它是微秒,如果你要使用 time包函数,这会导致进一步的计算问题。

从 Go 1.13开始,您可以使用新的持续时间方法 MicrosecondsMilliseconds,它们将持续时间作为它们各自命名单元的整数计数返回。

Https://golang.org/doc/go1.13#time