54 lines
1.0 KiB
Go
54 lines
1.0 KiB
Go
package policy
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
)
|
|
|
|
type Time struct {
|
|
Hour int
|
|
Minute int
|
|
Second int
|
|
}
|
|
|
|
func (t Time) Eq(other Time) bool {
|
|
return t.Hour == other.Hour && t.Minute == other.Minute && t.Second == other.Second
|
|
}
|
|
|
|
func (t Time) After(other Time) bool {
|
|
return t.Seconds() > other.Seconds()
|
|
}
|
|
|
|
func (t Time) Before(other Time) bool {
|
|
return t.Seconds() < other.Seconds()
|
|
}
|
|
|
|
func (t Time) Seconds() int {
|
|
return t.Hour*3600 + t.Minute*60 + t.Second
|
|
}
|
|
|
|
func (t Time) MarshalJSON() ([]byte, error) {
|
|
return []byte(fmt.Sprintf(`"%02d:%02d:%02d"`, t.Hour, t.Minute, t.Second)), nil
|
|
}
|
|
|
|
var timeFormats = []string{
|
|
time.TimeOnly,
|
|
"15:04",
|
|
time.Kitchen,
|
|
}
|
|
|
|
func Now() Time {
|
|
now := time.Now()
|
|
return Time{now.Hour(), now.Minute(), now.Second()}
|
|
}
|
|
|
|
func ParseTime(s string) (t Time, err error) {
|
|
var tt time.Time
|
|
for _, layout := range timeFormats {
|
|
if tt, err = time.Parse(layout, s); err == nil {
|
|
return Time{tt.Hour(), tt.Minute(), tt.Second()}, nil
|
|
}
|
|
}
|
|
return Time{}, fmt.Errorf("time: invalid time %q", s)
|
|
}
|