github.com/bingoohuang/gg@v0.0.0-20240325092523-45da7dee9335/pkg/jsoni/extra/time_as_int64_codec.go (about) 1 package extra 2 3 import ( 4 "context" 5 "time" 6 "unsafe" 7 8 "github.com/bingoohuang/gg/pkg/jsoni" 9 ) 10 11 // RegisterTimeAsInt64Codec encode/decode time since number of unit since epoch. the precision is the unit. 12 func RegisterTimeAsInt64Codec(precision time.Duration) { 13 jsoni.RegisterTypeEncoder("time.Time", &timeAsInt64Codec{precision}) 14 jsoni.RegisterTypeDecoder("time.Time", &timeAsInt64Codec{precision}) 15 } 16 17 type timeAsInt64Codec struct { 18 precision time.Duration 19 } 20 21 func (codec *timeAsInt64Codec) Decode(_ context.Context, ptr unsafe.Pointer, iter *jsoni.Iterator) { 22 nanoseconds := iter.ReadInt64() * codec.precision.Nanoseconds() 23 *((*time.Time)(ptr)) = time.Unix(0, nanoseconds) 24 } 25 26 func (codec *timeAsInt64Codec) IsEmpty(_ context.Context, ptr unsafe.Pointer, _ bool) bool { 27 ts := *((*time.Time)(ptr)) 28 return ts.UnixNano() == 0 29 } 30 31 func (codec *timeAsInt64Codec) Encode(_ context.Context, ptr unsafe.Pointer, stream *jsoni.Stream) { 32 ts := *((*time.Time)(ptr)) 33 stream.WriteInt64(ts.UnixNano() / codec.precision.Nanoseconds()) 34 }