1 回答
TA贡献1784条经验 获得超7个赞
由于time.Time是在特定位置的特定时刻,因此将其用于没有日期或时区的任意时钟时间可能会很尴尬。您真正要寻找的是自 00:00 以来的持续时间,因此 atime.Duration更有意义。例如,您甚至可以根据自午夜以来的分钟数使用自己的类型,但如果您使用 a,time.Duration您将能够time.Time更轻松地安排时间。
这是一个示例函数,可将您的时钟时间和分钟解析为 time.Duration
func ParseTime(t string) (time.Duration, error) {
var mins, hours int
var err error
parts := strings.SplitN(t, ":", 2)
switch len(parts) {
case 1:
mins, err = strconv.Atoi(parts[0])
if err != nil {
return 0, err
}
case 2:
hours, err = strconv.Atoi(parts[0])
if err != nil {
return 0, err
}
mins, err = strconv.Atoi(parts[1])
if err != nil {
return 0, err
}
default:
return 0, fmt.Errorf("invalid time: %s", t)
}
if mins > 59 || mins < 0 || hours > 23 || hours < 0 {
return 0, fmt.Errorf("invalid time: %s", t)
}
return time.Duration(hours)*time.Hour + time.Duration(mins)*time.Minute, nil
}
您也可以将其与您自己的类型结合使用,使用相同的底层 int64 类型,以便您可以轻松地格式化 time.Duration 并添加您自己的方法。如果从 ParseTime返回 aTime或 atime.Duration更方便,这取决于您。这里的两个是可以直接转换的。
type Time int64
func (t Time) Hours() int {
return int(time.Duration(t) / time.Hour)
}
func (t Time) Minutes() int {
return int((time.Duration(t) % time.Hour) / time.Minute)
}
func (t Time) String() string {
return fmt.Sprintf("%02d:%02d", t.Hours(), t.Minutes())
}
你可以像这样组合这些:http : //play.golang.org/p/E679m2wlUO
- 1 回答
- 0 关注
- 159 浏览
添加回答
举报