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  }