58 lines
1.2 KiB
Go
58 lines
1.2 KiB
Go
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)
|
|
}
|