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

Go 将time.Duration类型的微秒值转换为毫秒,go,time,Go,Time,我正在使用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)

我正在使用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/1000
jitter=jitter/1000
(将微秒转换为毫秒)时,我得到的是以纳秒为单位的抖动:(.是否有任何方法可以获得相同的延迟和抖动单位毫秒。

Number to
time.Duration
是一种将
int64
作为其属性的类型,它以纳秒为单位存储持续时间

如果您知道该值,但需要的不是纳秒,只需将所需单位乘以即可,例如:

d := 100 * time.Microsecond
fmt.Println(d) // Output: 100µs
上述操作之所以有效,是因为
100
是非类型化的,它可以自动转换为
time.Duration
,它具有
int64
基础类型

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

时间.持续时间
到数字 因此
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
试一下上面的例子

如果抖动(持续时间)小于要将其转换为的单位,则需要使用浮点除法,否则将执行整数除法以截断分数部分。有关详细信息,请参阅:

在分割之前,将抖动和单位转换为
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
输出(在上尝试):


latency
jitter
变量的类型为
time.Duration
,其基本类型为int64,以纳秒表示

使用打印功能时‍‍‍‍ ‍类型为
time的方法。调用Duration
并在打印Duration时使用
h
s
m
µ
n
符号,以下是
字符串
方法的文档:

// 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
类型,因为如果您不这样做,它将仍然在
时间中。持续时间
类型和该类型的值被认为是纳秒单位,但现在是微秒,如果您要使用时间包函数,这将在计算中造成进一步的问题。

从Go 1.13开始,您可以使用新的持续时间方法
微秒
毫秒
,将持续时间作为各自命名单位的整数计数返回


我想将抖动转换为毫秒,以微秒为单位。抖动是时间。持续时间类型。这对它不起作用。我尝试过做抖动=(stats.StdDevRtt/time.Nanosecond)。@supriya这是我答案的后半部分:以毫秒为单位获得它:
ms:=int64(d2/time.毫秒)
当我做ms:=int64时(d2/次,毫秒),它给出了jitter=0,这是正确的,因为我得到的jitter是61微秒,也就是0.061毫秒,当用int四舍五入时,它会给出0作为jitter值,但这不是我想要的…我想要的是小数点后的jitter值,即0.061…有什么方法可以这样做吗?它工作了。我还有一个疑问。它现在打印的是什么“0.061”。我可以像“0.061毫秒”那样得到它吗?@supriya你可以随意打印它:
fmt.Printf(“%.3f毫秒”,毫秒)
。我试过做jitterInMilliSeconds:=(抖动/时间.微秒)所以我现在得到的是以纳秒为单位的抖动…正如你在回答中所写的,当打印时间。持续时间类型值时,调用string方法,它确保打印时,前导数字是非零的。因为我得到的抖动值是64.6微秒,所以以毫秒为单位,它将是0.064毫秒,小于零。所以这是我用纳米碳管除以时间的原因吗。微秒…有什么办法吗?@supriya抱歉,
jitterinmillseconds
变量应该是
latencyInMicroSeconds
(已修复),也许这个示例有助于解决这个问题:备注:这些方法截断不舍入。例如,对于0.999μs,我们可以看到
time.Duration(999).Microseconds()
返回
0
// 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)