Note that ParseInLocation(..., time.UTC) should give you the same behavior in both test scenarios. If you have to use Parse, you can set time.Location = time.UTC, with the same result.
On Wed, Aug 24, 2016 at 10:05 AM <nrjon...@gmail.com> wrote: > Thanks for the response! > > On Wednesday, August 24, 2016 at 7:16:00 AM UTC-7, Ian Lance Taylor wrote: > >> On Tue, Aug 23, 2016 at 10:58 PM, <nrjo...@gmail.com> wrote: >> > >> > I was running into issues with comparing time.Time objects in a unit >> test >> > that would pass on a CI server, but fail on my local machine. I wanted >> to >> > see if anyone could double check my understanding of how `time.Parse` >> treats >> > locations (I posted on Stack Overflow about it if it's helpful to see), >> > though I think I now understand why; I was initially confused by the >> fact >> > that `time.Parse` wasn't setting "2017-08-15T22:30:00+00:00"'s timezone >> to >> > be UTC, since the docs for `time.Parse` read: "In the absence of a time >> zone >> > indicator, Parse returns a time in UTC." >> >> Note that timezones don't matter when comparing time.Time values, >> assuming you use the Equal method. >> > > Interesting, the test in question was using `reflect.DeepEqual`, which > explains why it failed. > > >> >> As far as Parse returning UTC, whether there is a timezone indicator >> or not is a function of the format string passed to Parse. It's not a >> function of the string being parsed. >> > > Ah yes, I really mean `Parse` with `time.RFC3339` as the format string > (the issue is actually coming from decoding a JSON string into a > `time.Time` field, which expects a quoted string in RFC 3339 format - so I > was conflating the two). However, I believe the implementation details of > `Parse` do seem to affect the timezone indicator. If the timezone of the > system happens to have the same offset as the offset present in the string > being parsed, then the timezone indicator is set to the timezone of the > machine; if not, it's a "fabricated location" with an empty string. So > parsing the same string (and using the same format string) on different > machines will return different timezone indicators. > > >> >> >> > I thought I was seeing inconsistencies with how an RFC 3339 time was >> > interpreted on my local machine vs. on a CI server (and on the Go >> > Playground), but came up with a few examples that may explain the >> behavior I >> > was seeing. Please bear with my examples to see if I understand >> correctly! >> > >> > >> > (1) "2017-08-15T22:30:00+00:00" is interpreted as having 0 hour offset. >> If >> > the system's local time has a 0 hour offset (such as UTC), then the >> Location >> > in the parsed time.Time value has UTC as its location string. If the >> > system's local time has any other offset, then the Location has an >> empty >> > string for its location string. This is suggested by this line in the >> docs >> > of Parse: >> > >> > When parsing a time with a zone offset like -0700, if the offset >> corresponds >> > to a time zone used by the current location (Local), then Parse uses >> that >> > location and zone in the returned time. Otherwise it records the time >> as >> > being in a fabricated location with time fixed at the given zone >> offset. >> > >> > Since the CI server in question has its time set to UTC (as does the Go >> > Playground), then UTC is set to be the location. Since my local machine >> does >> > not have its timezone set to UTC, a "fabricated" location is set. >> >> Sounds right. >> > > Thanks for clarifying, this is the crux of what I had been confused by. > > >> >> > (2) 2017-08-15T22:30:00Z is interpreted as being UTC no matter what; >> the Z >> > carries both the fact that there is a 0 hour offset, and that it is in >> UTC. >> > Parsing such a string works the same way on my local machine as our CI >> > server and the Go Playground. >> > >> > Those two examples are shown here: https://play.golang.org/p/mYkMhS9sJT >> > (with the output I see on my local machine included). >> > >> > If all of that is correct, I guess my last question is: is +00:00 >> supposed >> > to imply UTC? I'm assuming someone else has thought harder about this >> > before, but I was a little confused by the wording in RFC 3339 here: >> >> No. A "Z" in the string being parsed implies UTC. +00:00 implies the >> zero offset, which may have daylight savings time. >> >> At least, that is my understanding. >> > > I see. For context - the `time.Time` I'm trying to parse is part of a JSON > blob being created by PHP code and sent to a Go app. It appears (perhaps > not shockingly) that PHP has a different interpretation of RFC 3339's > serialization of a UTC timestamp, and just tacks on the "+00:00" instead of > "Z." See this gist > <https://gist.github.com/nrjones8/0a625aa8d07c94a582fc1517b04b0b15> for > an example. Sigh. > > Nick > > > >> >> Ian >> > -- > You received this message because you are subscribed to the Google Groups > "golang-nuts" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to golang-nuts+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.