【发布时间】:2015-08-12 20:43:27
【问题描述】:
默认time.Duration 以2h0m0s 等格式打印。
但是,我想将其打印为2 Hours 或2 Hours 1 Min
我可以这样做的一种方法是创建一个新的struct TimeDurationStruct 并创建一个String() 函数。我在golang playground做了同样的事情
工作代码
package main
import (
"fmt"
"time"
"math"
)
type TimeDurationStruct struct {
t time.Duration
}
func (i *TimeDurationStruct) Set(t time.Duration) {
i.t = t
}
func (i TimeDurationStruct) String() string {
duration := i.t
var dayString, hourMinString string
var days, hours float64
totalHours := duration.Hours()
minutes := math.Mod(duration.Minutes(), 60.0)
if totalHours < 24.0 {
hours = totalHours
} else {
hours = math.Mod(totalHours, 24.0)
days = totalHours / 24.0
}
if hours == 0 {
} else if hours < 1 {
if minutes == 1 {
hourMinString = "1 Min"
} else {
hourMinString = fmt.Sprintf("%g Mins", minutes)
}
} else if hours >= 1 && hours < 2 {
if minutes == 0 {
hourMinString = "1 Hour"
} else if minutes == 1 {
hourMinString = "1 Hour 1 Min"
} else {
hourMinString = fmt.Sprintf("1 Hour %g Mins", minutes)
}
} else {
if minutes == 0 {
hourMinString = fmt.Sprintf("%g Hours", hours)
} else if minutes == 1 {
hourMinString = fmt.Sprintf("%g Hours 1 Min", hours)
} else {
hourMinString = fmt.Sprintf("%g Hours %g Mins", hours, minutes)
}
}
if days > 0 {
if days == 1 {
dayString = "1 Day"
} else {
dayString = fmt.Sprintf("%g Days ", days)
}
}
return dayString + hourMinString
}
func main() {
t := time.Now()
d := t.Add(2 * time.Hour).Sub(t)
fmt.Println(d)
var i TimeDurationStruct
i.Set(d)
fmt.Println(i)
}
问题
-
是否可以覆盖
time.Durationtype而不是结构类型。例如type TimeDurationStruct time.Duration我试过here,但是不行……
有没有更好/更简单的方法?
【问题讨论】:
-
另一个问题有an answer,它显示了嵌入(顺便说一句,您可能应该在这里而不是非导出的命名字段)和非嵌入自定义之间的区别
time.Time类型。 -
我更新了问题,关于我是否只能覆盖 time.Duration 类型的 String() 函数。太棒了,我现在使用嵌入式类型并且可以工作play.golang.org/p/tWyd48ajpl