Sorry, that's time.Local = time.UTC.

On Wed, Aug 24, 2016 at 8:26 PM Matt Harden <matt.har...@gmail.com> wrote:

> 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.

Reply via email to