diff --git a/extra/time_as_int64_codec.go b/extra/time_as_int64_codec.go index 202c9ed..f961750 100644 --- a/extra/time_as_int64_codec.go +++ b/extra/time_as_int64_codec.go @@ -7,11 +7,12 @@ import ( ) // keep epoch milliseconds -func RegisterTimeAsInt64Codec() { - jsoniter.RegisterTypeEncoder("time.Time", &timeAsInt64Codec{}) +func RegisterTimeAsInt64Codec(precision time.Duration) { + jsoniter.RegisterTypeEncoder("time.Time", &timeAsInt64Codec{precision}) } type timeAsInt64Codec struct { + precision time.Duration } func (codec *timeAsInt64Codec) IsEmpty(ptr unsafe.Pointer) bool { @@ -20,7 +21,7 @@ func (codec *timeAsInt64Codec) IsEmpty(ptr unsafe.Pointer) bool { } func (codec *timeAsInt64Codec) Encode(ptr unsafe.Pointer, stream *jsoniter.Stream) { ts := *((*time.Time)(ptr)) - stream.WriteInt64(ts.UnixNano()) + stream.WriteInt64(ts.UnixNano() / codec.precision.Nanoseconds()) } func (codec *timeAsInt64Codec) EncodeInterface(val interface{}, stream *jsoniter.Stream) { jsoniter.WriteToStream(val, stream, codec) diff --git a/extra/time_as_int64_codec_test.go b/extra/time_as_int64_codec_test.go index 357685c..7e42a63 100644 --- a/extra/time_as_int64_codec_test.go +++ b/extra/time_as_int64_codec_test.go @@ -9,8 +9,16 @@ import ( func Test_time_as_int64(t *testing.T) { should := require.New(t) - RegisterTimeAsInt64Codec() + RegisterTimeAsInt64Codec(time.Nanosecond) output, err := jsoniter.Marshal(time.Unix(1, 1002)) should.Nil(err) should.Equal("1000001002", string(output)) } + +func Test_time_as_int64_keep_microsecond(t *testing.T) { + should := require.New(t) + RegisterTimeAsInt64Codec(time.Microsecond) + output, err := jsoniter.Marshal(time.Unix(1, 1002)) + should.Nil(err) + should.Equal("1000001", string(output)) +}