Go 以天、小时、分钟、秒格式表示的自开始的时间

Go 以天、小时、分钟、秒格式表示的自开始的时间,go,time,Go,Time,是否有一种方法可以格式化的输出,以便在适用时添加天数,例如: [days]d[hours]h[minutes]m[seconds]s 880d12h9m41.7s 当前格式似乎仅使用小时作为最大单位: start := time.Unix(1411691219, 0) diff := time.Since(start) 21132h9m41.714117301s 但我想用几天而不是几小时来获得以下信息: [days]d[hours]h[minutes]m[seconds]s 880d1

是否有一种方法可以格式化的输出,以便在适用时添加天数,例如:

[days]d[hours]h[minutes]m[seconds]s
880d12h9m41.7s
当前格式似乎仅使用小时作为最大单位:

start := time.Unix(1411691219, 0)
diff := time.Since(start)

21132h9m41.714117301s
但我想用几天而不是几小时来获得以下信息:

[days]d[hours]h[minutes]m[seconds]s
880d12h9m41.7s
我目前正在使用下面的
TimeDiff
函数来生成所需的输出,但不知道是否有一种简单/更好/原生的方法来实现这一点

package main

import (
    "bytes"
    "fmt"
    "math"
    "time"
)

func main() {
    start := time.Unix(1411691219, 0)
    diff := time.Since(start)
    fmt.Printf("diff = %s\n", diff)
    fmt.Printf("diff = %s\n", TimeDiff(start))
}

func TimeDiff(t time.Time) string {
    diff := time.Since(t)
    days := diff / (24 * time.Hour)
    hours := diff % (24 * time.Hour)
    minutes := hours % time.Hour
    seconds := math.Mod(minutes.Seconds(), 60)
    var buffer bytes.Buffer
    if days > 0 {
        buffer.WriteString(fmt.Sprintf("%dd", days))
    }
    if hours/time.Hour > 0 {
        buffer.WriteString(fmt.Sprintf("%dh", hours/time.Hour))
    }
    if minutes/time.Minute > 0 {
        buffer.WriteString(fmt.Sprintf("%dm", minutes/time.Minute))
    }
    if seconds > 0 {
        buffer.WriteString(fmt.Sprintf("%.1fs", seconds))
    }
    return buffer.String()
}

一个幼稚的实现可能是:


(注意对日持续时间常数的假设)。

天真的实现可能是:


(注意白天持续时间常数的假设)。

要回答您的确切问题:

package main

import (
    "fmt"
    "time"
)

func FormatSince(t time.Time) string {
    const (
        Decisecond = 100 * time.Millisecond
        Day        = 24 * time.Hour
    )
    ts := time.Since(t)
    sign := time.Duration(1)
    if ts < 0 {
        sign = -1
        ts = -ts
    }
    ts += +Decisecond / 2
    d := sign * (ts / Day)
    ts = ts % Day
    h := ts / time.Hour
    ts = ts % time.Hour
    m := ts / time.Minute
    ts = ts % time.Minute
    s := ts / time.Second
    ts = ts % time.Second
    f := ts / Decisecond
    return fmt.Sprintf("%dd%dh%dm%d.%ds", d, h, m, s, f)
}
对于Go 1.8及更早版本,这将提供绝对(UTC)时间差。它可能与受夏令时影响的挂钟时间差不匹配。它还可能受到系统壁(实时)时钟调整的影响


从Go 1.9开始,将使用不受系统挂钟时间或夏令时变化影响的单调时钟计算差值。

要回答您的确切问题:

package main

import (
    "fmt"
    "time"
)

func FormatSince(t time.Time) string {
    const (
        Decisecond = 100 * time.Millisecond
        Day        = 24 * time.Hour
    )
    ts := time.Since(t)
    sign := time.Duration(1)
    if ts < 0 {
        sign = -1
        ts = -ts
    }
    ts += +Decisecond / 2
    d := sign * (ts / Day)
    ts = ts % Day
    h := ts / time.Hour
    ts = ts % time.Hour
    m := ts / time.Minute
    ts = ts % time.Minute
    s := ts / time.Second
    ts = ts % time.Second
    f := ts / Decisecond
    return fmt.Sprintf("%dd%dh%dm%d.%ds", d, h, m, s, f)
}
对于Go 1.8及更早版本,这将提供绝对(UTC)时间差。它可能与受夏令时影响的挂钟时间差不匹配。它还可能受到系统壁(实时)时钟调整的影响


从Go 1.9开始,将使用单调时钟计算差异,该时钟不受系统挂钟时间或夏时制时间变化的影响。

这是一个难题,因为天有不同的持续时间:不仅仅是闰秒,还有夏时制。如果你的一天是24小时:很好。如果您考虑以月或年为单位显示时间增量,问题会变得更加明显。目前我主要想知道一个过程花费了多少时间,而不是对日期进行任何日期计算。相关:。这是一个很难解决的问题,因为天有不同的持续时间:不仅仅是闰秒,还有夏时制。如果你的一天是24小时:很好。如果您考虑以月或年为单位显示时间增量,问题会变得更加明显。目前,我主要想知道一个过程花费了多少时间,而不是对日期进行任何日期计算。相关:。