package models import ( "encoding/json" "gogs.mikescher.com/BlackForestBytes/goext/langext" "gogs.mikescher.com/BlackForestBytes/goext/rfctime" "time" ) type SCNTime time.Time func (t SCNTime) MarshalToDB(v SCNTime) (int64, error) { return v.Time().UnixMilli(), nil } func (t SCNTime) UnmarshalToModel(v int64) (SCNTime, error) { return NewSCNTime(time.UnixMilli(v)), nil } func (t SCNTime) Time() time.Time { return time.Time(t) } func (t *SCNTime) UnmarshalJSON(data []byte) error { str := "" if err := json.Unmarshal(data, &str); err != nil { return err } t0, err := time.Parse(time.RFC3339Nano, str) if err != nil { return err } *t = SCNTime(t0) return nil } func (t SCNTime) MarshalJSON() ([]byte, error) { str := t.Time().In(time.UTC).Format(time.RFC3339Nano) return json.Marshal(str) } func NewSCNTime(t time.Time) SCNTime { return SCNTime(t) } func NewSCNTimePtr(t *time.Time) *SCNTime { if t == nil { return nil } return langext.Ptr(SCNTime(*t)) } func NowSCNTime() SCNTime { return SCNTime(time.Now()) } func tt(v rfctime.AnyTime) time.Time { if r, ok := v.(time.Time); ok { return r } if r, ok := v.(rfctime.RFCTime); ok { return r.Time() } return time.Unix(0, v.UnixNano()).In(v.Location()) }