字符串 2h 而不是 2h0m0s 的持续时间

Time duration to string 2h instead 2h0m0s

默认的 time.Duration 字符串方法通过添加 0s 分钟和 0m0s 小时来格式化持续时间。是否有我可以使用的函数将生成 5m 而不是 5m0s2h 而不是 2h0m0s ... 或者我必须实现自己的?

前言: 我在 github.com/icza/gox, see timex.ShortDuration().

发布了这个实用程序

标准库中没有,但创建一个真的很容易:

func shortDur(d time.Duration) string {
    s := d.String()
    if strings.HasSuffix(s, "m0s") {
        s = s[:len(s)-2]
    }
    if strings.HasSuffix(s, "h0m") {
        s = s[:len(s)-2]
    }
    return s
}

正在测试:

h, m, s := 5*time.Hour, 4*time.Minute, 3*time.Second
ds := []time.Duration{
    h + m + s, h + m, h + s, m + s, h, m, s,
}

for _, d := range ds {
    fmt.Printf("%-8v %v\n", d, shortDur(d))
}

输出(在 Go Playground):

上试试
5h4m3s   5h4m3s
5h4m0s   5h4m
5h0m3s   5h0m3s
4m3s     4m3s
5h0m0s   5h
4m0s     4m
3s       3s

您可以像这样四舍五入:

        func RountTime(roundTo string, value time.Time) string {
            since := time.Since(value)
            if roundTo == "h" {
                since -= since % time.Hour
            }
            if roundTo == "m" {
                since -= since % time.Minute
            }
            if roundTo == "s" {
                since -= since % time.Second
            }
            return since.String()
        }