【问题标题】:how to convert duration to days in Go如何在 Go 中将持续时间转换为天数
【发布时间】:2018-08-23 06:14:22
【问题描述】:

在 Go 中,如何将持续时间转换为天数?

例如 1W => 7 天、1Y => 365 天等

【问题讨论】:

  • d.Hours()/24,给你天数
  • 对此没有直接的答案,因为“天”没有普遍适用的定义。
  • @nilsocket:更正。 d.Hours()/24 为您提供 24 小时周期数,这可能与天数相同也可能不同,具体取决于用例。
  • 另请注意,1 年不是 365 天。

标签: go intervals duration


【解决方案1】:

对于许多常见目的,简短的回答就是将小时数除以 24,以获得通常有用的天数近似值。

d, _ := time.ParseDuration("48h")
days := d.Hours()/24 // 2 days

但是,这并不总是“正确”的,具体取决于您的情况。考虑:

从 2018 年 11 月 1 日午夜到 2018 年 11 月 8 日午夜之间有多少天?答案实际上至少取决于两件事:您对日期的定义以及您所在的位置。如果您计算两个日期之间的持续时间,然后按上述方法进行划分,那么您的答案将是 7.04167 天,如果您位于美国,则由于夏令时的变化。

如果您的时间段发生在春季的正确时间,您的答案可能是 6.95833 天,因为 DST 朝另一个方向变化。

如果您考虑到多个时区、闰秒或其他“正常”偏差,您最终可能会得到更令人困惑的结果。

出于某些目的,7.04167 天是正确的答案。出于其他目的,7 将是正确答案。

因此,在尝试计算“天数”时,首要任务始终是确定什么定义对您很重要。其次,弄清楚如何计算一个有意义的数字来满足这个需求。

【讨论】:

    【解决方案2】:

    你可以试试这个 pkg:https://github.com/hako/durafmt

    package main
    
    import (
        "fmt"
        "github.com/hako/durafmt"
    )
    
    func main() {
        duration, err := durafmt.ParseString("354h22m3.24s")
        if err != nil {
            fmt.Println(err)
        }
        fmt.Println(duration) // 2 weeks 18 hours 22 minutes 3 seconds
        // duration.String() // String representation. "2 weeks 18 hours 22 minutes 3 seconds"
    }
    

    【讨论】:

      猜你喜欢
      • 2022-11-12
      • 1970-01-01
      • 2020-09-05
      • 2012-12-26
      • 2017-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多