From c6e59485349732d1d34b53e128555f89744b5a6b Mon Sep 17 00:00:00 2001 From: Jae Kwon Date: Mon, 31 Aug 2015 13:00:20 -0700 Subject: [PATCH] time writes milliseconds using ISO8601 format --- wire/reflect.go | 8 ++++---- wire/time.go | 14 ++++++++++++-- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/wire/reflect.go b/wire/reflect.go index f8f916f37..d964d585a 100644 --- a/wire/reflect.go +++ b/wire/reflect.go @@ -93,7 +93,7 @@ var ( ) const ( - rfc2822 = "Mon Jan 02 15:04:05 -0700 2006" + iso8601 = "2006-01-02T15:04:05.000Z" // forced microseconds ) // NOTE: do not access typeInfos directly, but call GetTypeInfo() @@ -731,7 +731,7 @@ func readReflectJSON(rv reflect.Value, rt reflect.Type, o interface{}, err *erro return } log.Info(Fmt("Read time: %v", str)) - t, err_ := time.Parse(rfc2822, str) + t, err_ := time.Parse(iso8601, str) if err_ != nil { *err = err_ return @@ -908,8 +908,8 @@ func writeReflectJSON(rv reflect.Value, rt reflect.Type, w io.Writer, n *int64, case reflect.Struct: if rt == timeType { // Special case: time.Time - t := rv.Interface().(time.Time) - str := t.Format(rfc2822) + t := rv.Interface().(time.Time).UTC() + str := t.Format(iso8601) jsonBytes, err_ := json.Marshal(str) if err_ != nil { *err = err_ diff --git a/wire/time.go b/wire/time.go index c4a573345..fde8b8ae5 100644 --- a/wire/time.go +++ b/wire/time.go @@ -3,15 +3,25 @@ package wire import ( "io" "time" + + . "github.com/tendermint/tendermint/common" ) -// Time +/* +Writes nanoseconds since epoch but with millisecond precision. +This is to ease compatibility with Javascript etc. +*/ func WriteTime(t time.Time, w io.Writer, n *int64, err *error) { - WriteInt64(t.UnixNano(), w, n, err) + nanosecs := t.UnixNano() + millisecs := nanosecs / 1000000 + WriteInt64(millisecs*1000000, w, n, err) } func ReadTime(r io.Reader, n *int64, err *error) time.Time { t := ReadInt64(r, n, err) + if t%1000000 != 0 { + PanicSanity("Time cannot have sub-millisecond precision") + } return time.Unix(0, t) }