Files
bot-pontos/backend/internal/domain/clock.go
2026-10-23 22:31:02 -03:00

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())
}