It would also be possible to implement `json.Marshaler` to use a different time format. In particular, it might be reasonable to encode the zero value of time.Time as `null`, instead of a string (though mixed types in json messages are… icky).
Personally, I'm always very cautious about encoding and decoding times. There isn't really a standard way to transmit timezone information, especially as timezone definitions can even change over time, AIUI. So, even if you specify which timezone a point in time should be in, you can't rely on the receiver of the message having the same understanding of that timezone.
Using UTC for storage and transmission is probably a better option. You essentially treat the stored data purely as "a point in time", while timezone info is specific to the presentation. A time.Time isn't just a point in time, though, so if you really marshal "a time.Time", you have to somehow include timezone info - so I kinda understand why the default MarshalJSON method doesn't convert it to UTC first.