package helpers import ( "encoding/json" "fmt" "time" ) type DateOnly struct { time.Time } func (d DateOnly) MarshalJSON() ([]byte, error) { if d.IsZero() { return []byte("null"), nil } return json.Marshal(d.Format("2006-01-02")) } func (d *DateOnly) UnmarshalJSON(b []byte) error { var s string if err := json.Unmarshal(b, &s); err != nil { return err } if s == "" { return nil } t, err := time.Parse("2006-01-02", s) if err != nil { return err } d.Time = t return nil } type KontorTime struct { time.Time } var layouts = []string{ "2006-01-02 15:04:05.000000", "2006-01-02T15:04:05.999Z", "2006-01-02", } func (kt KontorTime) MarshalJSON() ([]byte, error) { if kt.IsZero() { return []byte("null"), nil } return json.Marshal(kt.Format(layouts[0])) } func (kt *KontorTime) UnmarshalJSON(b []byte) error { var s string if err := json.Unmarshal(b, &s); err != nil { return err } if s == "" { return nil } for _, layout := range layouts { t, err := time.Parse(layout, s) if err == nil { kt.Time = t return nil } } return fmt.Errorf("failed to parse time from %s", s) }