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小时:很好。如果您考虑以月或年为单位显示时间增量,问题会变得更加明显。目前,我主要想知道一个过程花费了多少时间,而不是对日期进行任何日期计算。相关:。