Есть ли способ форматирования вывода time.Since() добавить дни, когда aplicable, что-то вроде:время, так как в формате дни, часы, минуты, секунды
[days]d[hours]h[minutes]m[seconds]s
Текущий формат, кажется, использует только часов, как максимальная единица измерения:
start := time.Unix(1411691219, 0)
diff := time.Since(start)
21132h9m41.714117301s
Но я хотел бы использовать дни вместо часов, чтобы получить что-то вроде:
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()
}
Это проблема _hard_, поскольку дни имеют разные длительности: не просто прыжок секунд, но переход на летнее время. Если ваш день 24 часа: Хорошо. Проблема становится более очевидной, если вы думаете о отображении временных дельта в единицах месяца или года. – Volker
В настоящее время я в основном хочу знать, какой процесс прошел, а не проводить расчеты даты в отношении дат. – nbari
Связанные: [golang time.Since() с месяцами и годами] (http://stackoverflow.com/questions/36530251/golang-time-since-with-months-and-years/36531443#36531443). – icza