创建一个 time.Duration from float64 秒

Ulr*_*rdt 13 time data-conversion go

我有一个float64包含以秒为单位的持续时间。我正在寻找一种方法将此值转换为time.Duration. 我能够执行此转换,但我想知道是否没有更优雅的方法。

我的方法是这样的:

    var timeout float64 // input value of float type

    var res time.Duration // result value of time.Duration type

    res += time.Duration(math.Round(timeout)) * time.Second
    timeout -= math.Round(timeout)
    timeout *= 1000
    res += time.Duration(math.Round(timeout)) * time.Millisecond
    timeout -= math.Round(timeout)
    timeout *= 1000
    res += time.Duration(math.Round(timeout)) * time.Microsecond
    timeout -= math.Round(timeout)
    timeout *= 1000
    res += time.Duration(math.Round(timeout)) * time.Nanosecond

    return res
Run Code Online (Sandbox Code Playgroud)

我不喜欢的是它很麻烦而且不可靠。我希望 Go 能够开箱即用地提供类似的东西,并以检测溢出和类似范围违规的方式执行这些转换。似乎Go 还没有出现,但也许我错过了一些明显的东西,因此我的问题。

笔记:

  • 这个问题没有解决我的需求,因为它与相反的转换方式相当相关。这种转换实际上非常轻松,这让我更惊讶的是我需要的转换并不存在。
  • 为什么我不使用毫秒呢?原因很简单:一致性、KISS 原则、最小意外原则。时间的 SI 单位是秒。其他一切都仅源于此,因此我使用它作为默认值。
  • 关于之前的声明的挑剔:Go 本身说“没有对天或更大单位的定义,以避免夏令时时区转换之间的混淆。”。他们没有抓住重点,因为他们仍然有分钟和小时,尽管分钟有 58..61 秒。没什么大不了的,只是为了完整性而提及它。

小智 26

正如JimB 的评论所示,将秒数乘以每秒的持续时间单位数持续时间以纳秒为单位测量,但您的代码不需要知道该细节。

return time.Duration(timeout * float64(time.Second))
Run Code Online (Sandbox Code Playgroud)

转换为浮点数进行乘法,然后转换为持续时间以获得结果。