go.mercari.io/datastore@v1.8.2/testsuite/realworld/tbf/misc_model.go (about) 1 package tbf 2 3 import ( 4 "context" 5 "encoding/json" 6 "fmt" 7 "time" 8 9 "go.mercari.io/datastore" 10 ) 11 12 var _ datastore.PropertyTranslator = unixTime(time.Time{}) 13 var _ json.Marshaler = unixTime(time.Time{}) 14 var _ json.Unmarshaler = (*unixTime)(&time.Time{}) 15 16 type unixTime time.Time 17 18 func (t unixTime) ToPropertyValue(ctx context.Context) (interface{}, error) { 19 return time.Time(t), nil 20 } 21 22 func (t unixTime) FromPropertyValue(ctx context.Context, p datastore.Property) (dst interface{}, err error) { 23 origT, ok := p.Value.(time.Time) 24 if !ok { 25 return nil, datastore.ErrInvalidEntityType 26 } 27 return unixTime(origT), nil 28 } 29 30 func (t unixTime) MarshalJSON() ([]byte, error) { 31 unix := time.Time(t).UnixNano() / 1000000 // to JavaScript unix epoch 32 jsonNumber := json.Number(fmt.Sprintf("%d", unix)) 33 return json.Marshal(jsonNumber) 34 } 35 36 func (t *unixTime) UnmarshalJSON(b []byte) error { 37 var jsonNumber json.Number 38 err := json.Unmarshal(b, &jsonNumber) 39 if err != nil { 40 return err 41 } 42 unix, err := jsonNumber.Int64() 43 if err != nil { 44 return err 45 } 46 47 l, err := time.LoadLocation("Asia/Tokyo") 48 if err != nil { 49 return err 50 } 51 52 v := time.Unix(unix*1000000, 0).In(l) 53 *t = unixTime(v) 54 return nil 55 }