【问题标题】:Dividing a time.Duration in Golang划分时间。Golang 中的持续时间
【发布时间】:2019-02-20 00:41:24
【问题描述】:

目前,Go 中的 time 包没有“除法”功能或类似功能。您可以将 time.Duration 除以其他值,但这需要相当多的转换。有没有简单/明显的方法来划分 time.Duration 由我没有看到的 Go 中的东西? (我知道你可以除以一个数字常量,但我需要在动态的基础上进行。)我计划提交一个问题/功能请求以向time 包添加一个基本的“除法”功能,但是我想先在这里问一下,以防我错过了一些简单的方法来进行这种划分。

【问题讨论】:

  • 你需要给出具体的、真实的例子来说明你想要完成的事情。
  • 关于提交功能请求的任何更新?我同意这会很方便,例如求函数的平均执行时间。

标签: go


【解决方案1】:

Package time

import "time" 

为了避免混淆,天或更大的单位没有定义 跨夏令时时区转换。

要计算 Duration 中的单位数,请除以:

second := time.Second
fmt.Print(int64(second/time.Millisecond)) // prints 1000

要将整数个单位转换为持续时间,请乘以:

seconds := 10
fmt.Print(time.Duration(seconds)*time.Second) // prints 10s

const (
        Nanosecond  Duration = 1
        Microsecond          = 1000 * Nanosecond
        Millisecond          = 1000 * Microsecond
        Second               = 1000 * Millisecond
        Minute               = 60 * Second
        Hour                 = 60 * Minute
)

type Duration

持续时间表示两个瞬间之间经过的时间,作为 int64 纳秒计数。表示限制最大 可代表的持续时间约为 290 年。

type Duration int64

time.Duration 的除法和乘法在 Go time 包文档中进行了描述。

【讨论】:

  • 因为它只是一个int64,你也可以将它除以任何整数常量,例如someDuration / 2 完全合法。
  • time 包中给出的示例说明了如何计算 Duration 中的单元数——例如,获取的持续时间不是原始持续时间的 1/13。我知道你可以通过将time.Duration 和除数都转换为int64,进行除法,然后调用time.Duration(result) 来做到这一点。我有点惊讶time 没有“Divide”方法或类似的方法。
【解决方案2】:

如果除数是 2 的倍数,则可以使用移位代替,无需任何 铸造:

package main

import (
   "fmt"
   "time"
)

func main() {
   n := 1
   d := time.Minute >> n
   fmt.Println(d) // 30s
}

【讨论】:

    猜你喜欢
    • 2022-11-23
    • 2019-04-18
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2023-02-03
    • 2020-09-24
    • 2018-05-06
    • 1970-01-01
    相关资源
    最近更新 更多