将time.Duration类型的微秒值转换为毫秒

时间:2017-01-06 10:33:35

标签: go time

我正在使用go-ping(https://github.com/sparrc/go-ping)golang库来进行无特权的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(将微秒转换为毫秒)时,我得到的是几纳秒的抖动:(。有吗任何方式都可以获得相同的单位毫秒的延迟和抖动。

3 个答案:

答案 0 :(得分:71)

编号为time.Duration

time.Durationint64underlying type的类型,以纳秒为单位存储持续时间。

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

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

上述方法有效,因为100是无类型constant,可以自动转换为time.Duration基础类型int64

请注意,如果您将值作为输入值,则必须使用显式type conversion

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

尝试Go Playground上的示例。

如果您的抖动(持续时间)小于您要将其转换为的单位,则需要使用浮点除法,否则将执行整数除法,从而切断小数部分。有关详细信息,请参阅:Golang Round to Nearest 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

输出(在Go Playground上尝试):

61µs
ms: 0.061

答案 1 :(得分:4)

latencyjitter变量的类型为time.Duration,其definition基类型为int64,以纳秒表示。

使用打印功能时,会调用time.Duration类型的String方法,并使用hsm,{{1}打印持续时间时,},µ符号,以下是n方法的文档:

String

在时间包中有一些预先定义的constants可用于将持续时间变量转换为您首选的时间单位,如下所示:

// 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.

请注意我们将其转换为latencyInMicroSeconds := int64(jitter / time.Microsecond) 类型,因为如果您赢了,它仍然会处于int类型,并且该类型的值被认为是纳米秒单位但现在它是微秒,如果您打算使用时间包功能,会导致计算中的进一步问题。

答案 2 :(得分:1)

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

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