创建时间。持续时间从 float64 秒开始

问题描述 投票:0回答:3

我有一个

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

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

备注:

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

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

return time.Duration(timeout * float64(time.Second))

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

或者,您可以将超时转换为持续时间并乘以时间。第二个常数。

return time.Duration(timeout) * time.Second

0
投票

我不确定这里出了什么问题。您的要求很容易实现:

package main

import (
   "fmt"
   "time"
)

func duration(f float64) time.Duration {
   return time.Duration(f * 1e9)
}

func main() {
   t := duration(9)
   fmt.Println(t) // 9s
}

实际上就是一行代码,这有什么不优雅的呢?它可以更优雅的唯一方法是如果

time.Duration
本身就是
float64
。这是没有意义的,因为 Go 不会跟踪任何小于纳秒的东西。

https://golang.org/pkg/time#Duration


-1
投票
time.Duration(timeout) * time.Second

根据文档https://pkg.go.dev/time#Second

© www.soinside.com 2019 - 2024. All rights reserved.