[Python-Dev] PEP 495 accepted
Tim Peters
tim.peters at gmail.com
Tue Sep 22 17:11:03 CEST 2015
[Nick Coghlan]
>>> Based on the UTC/local diagram from the "Mind the Gap" section, am I
>>> correct in thinking that the modified invariant that also covers times
>>> in a gap is:
>>>
>>> dt ==
>>> datetime.fromtimestamp(dt.astimezone(utc).astimezone(dt.tzinfo).timestamp())
>>>
>>> That is, for local times that exist, the invariant "dt ==
>>> dt.astimezone(utc).astimezone(dt.tzinfo)" holds, but for times that
>>> don't exist, "dt.astimezone(utc).astimezone(dt.tzinfo)" will normalise
>>> them to be a time that actually exists in the original time zone, and
>>> that normalisation also effectively happens when calling
>>> "dt.timestamp()".
[Guido]
>> That can't be right -- There is no way any fromtimestamp() call can return
>> a time in the gap.
[Alexander Belopolsky]
> I don't think Nick said that.
I do, except that he didn't ;-) Count the parens carefully. The
top-level operation on the RHS is datetime.fromtimestamp(). However,
it didn't pass a tzinfo, so it creates a naive datetime. Assuming dt
was aware to begin with, the attempt to compare will always (gap or
not) raise an exception. If it had passed dt.tzinfo, then Guido is
right.
>> I think about the only useful invariant here is
>>
>> dt.timestamp() == dt.astimezone(utc).timestamp() ==
>> dt.astimezone(<any other tz>).timestamp()
> Yes, this is just another way to say that .astimezone() conversions are now
Nick, to be very clear, there are two scenarios here after PEP 495 is
implemented in Python:
1. You're using a pre-495 tzinfo. Then nothing changes from what happens today.
2. You're using a new 495-conforming tzinfo. Then the discussion
starts to apply.
More information about the Python-Dev
mailing list