package challenge import ( "fmt" "strconv" "strings" "time" ) const day = 24 * time.Hour func parseClock(value string) (time.Duration, error) { parts := strings.Split(value, ":") if len(parts) != 3 { return 0, fmt.Errorf("bad time %q", value) } h, err := strconv.Atoi(parts[0]) if err != nil { return 0, err } m, err := strconv.Atoi(parts[1]) if err != nil { return 0, err } s, err := strconv.Atoi(parts[2]) if err != nil { return 0, err } if h < 0 || h > 23 || m < 0 || m > 59 || s < 0 || s > 59 { return 0, fmt.Errorf("bad time %q", value) } return time.Duration(h)*time.Hour + time.Duration(m)*time.Minute + time.Duration(s)*time.Second, nil } func formatClock(d time.Duration) string { d %= day if d < 0 { d += day } h := int(d / time.Hour) d -= time.Duration(h) * time.Hour m := int(d / time.Minute) d -= time.Duration(m) * time.Minute s := int(d / time.Second) return fmt.Sprintf("%02d:%02d:%02d", h, m, s) } func formatDuration(d time.Duration) string { if d < 0 { d = 0 } h := int(d / time.Hour) d -= time.Duration(h) * time.Hour m := int(d / time.Minute) d -= time.Duration(m) * time.Minute s := int(d / time.Second) return fmt.Sprintf("%02d:%02d:%02d", h, m, s) }