From: Tom Clegg Date: Wed, 8 May 2019 15:43:33 +0000 (-0400) Subject: 14287: Ensure timestamps in responses have 9 digits of nanoseconds. X-Git-Tag: 2.0.0~282^2~48 X-Git-Url: https://git.arvados.org/arvados.git/commitdiff_plain/74ffe51bff92a0105c9fb51419d28646b7d53825 14287: Ensure timestamps in responses have 9 digits of nanoseconds. Arvados-DCO-1.1-Signed-off-by: Tom Clegg --- diff --git a/lib/controller/router/response.go b/lib/controller/router/response.go index 65e0159fa9..ddbeee666f 100644 --- a/lib/controller/router/response.go +++ b/lib/controller/router/response.go @@ -7,11 +7,15 @@ package router import ( "encoding/json" "net/http" + "strings" + "time" "git.curoverse.com/arvados.git/sdk/go/arvados" "git.curoverse.com/arvados.git/sdk/go/httpserver" ) +const rfc3339NanoFixed = "2006-01-02T15:04:05.000000000Z07:00" + type responseOptions struct { Select []string } @@ -41,6 +45,29 @@ func (rtr *router) sendResponse(w http.ResponseWriter, resp interface{}, opts re } tmp = selected } + // Format non-nil timestamps as rfc3339NanoFixed (by default + // they will have been encoded to time.RFC3339Nano, which + // omits trailing zeroes). + for k, v := range tmp { + if !strings.HasSuffix(k, "_at") { + continue + } + switch tv := v.(type) { + case *time.Time: + if tv == nil { + break + } + tmp[k] = tv.Format(rfc3339NanoFixed) + case time.Time: + tmp[k] = tv.Format(rfc3339NanoFixed) + case string: + t, err := time.Parse(time.RFC3339Nano, tv) + if err != nil { + break + } + tmp[k] = t.Format(rfc3339NanoFixed) + } + } json.NewEncoder(w).Encode(tmp) }