55 lines
1.4 KiB
Go
55 lines
1.4 KiB
Go
package domain
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
)
|
|
|
|
// ClockTime é um horário do dia (HH:MM), guardado em minutos desde 00:00.
|
|
type ClockTime int
|
|
|
|
func ParseClock(value string) (ClockTime, error) {
|
|
if len(value) != 5 || value[2] != ':' {
|
|
return 0, fmt.Errorf("horário inválido %q (use HH:MM)", value)
|
|
}
|
|
digits := [4]byte{value[0], value[1], value[3], value[4]}
|
|
for _, d := range digits {
|
|
if d < '0' || d > '9' {
|
|
return 0, fmt.Errorf("horário inválido %q (use HH:MM)", value)
|
|
}
|
|
}
|
|
hour := int(digits[0]-'0')*10 + int(digits[1]-'0')
|
|
minute := int(digits[2]-'0')*10 + int(digits[3]-'0')
|
|
if hour > 23 || minute > 59 {
|
|
return 0, fmt.Errorf("horário inválido %q", value)
|
|
}
|
|
return ClockTime(hour*60 + minute), nil
|
|
}
|
|
|
|
func MustParseClock(value string) ClockTime {
|
|
c, err := ParseClock(value)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
return c
|
|
}
|
|
|
|
func (c ClockTime) String() string {
|
|
return fmt.Sprintf("%02d:%02d", int(c)/60, int(c)%60)
|
|
}
|
|
|
|
// On devolve o instante desse horário na data (AAAA-MM-DD) e fuso informados.
|
|
func (c ClockTime) On(day string, loc *time.Location) time.Time {
|
|
date, err := time.ParseInLocation(DateLayout, day, loc)
|
|
if err != nil {
|
|
return time.Time{}
|
|
}
|
|
return time.Date(date.Year(), date.Month(), date.Day(), int(c)/60, int(c)%60, 0, 0, loc)
|
|
}
|
|
|
|
// ClockOf devolve o horário do dia de t no fuso informado.
|
|
func ClockOf(t time.Time, loc *time.Location) ClockTime {
|
|
local := t.In(loc)
|
|
return ClockTime(local.Hour()*60 + local.Minute())
|
|
}
|