Unmarshal incorrectly formatted datetime

You can define your own time field type that supports both formats:

type MyTime struct {
    time.Time
}

func (self *MyTime) UnmarshalJSON(b []byte) (err error) {
    s := string(b)

    // Get rid of the quotes "" around the value.
    // A second option would be to include them
    // in the date format string instead, like so below: 
    //   time.Parse(`"`+time.RFC3339Nano+`"`, s) 
    s = s[1:len(s)-1]

    t, err := time.Parse(time.RFC3339Nano, s)
    if err != nil {
        t, err = time.Parse("2006-01-02T15:04:05.999999999Z0700", s)
    }
    self.Time = t
    return
}

type Test struct {
    Time MyTime `json:"time"`
}

Try on Go Playground

In the example above we take the predefined format time.RFC3339Nano, which is defined like this:

RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"

and remove the :

"2006-01-02T15:04:05.999999999Z0700"

This time format used by time.Parse is described here: https://golang.org/pkg/time/#pkg-constants

Also see the documentation for time.Parse https://golang.org/pkg/time/#Parse

P.S. The fact that the year 2006 is used in the time format strings is probably because the first version of Golang was released that year.