On Fri, Jul 24, 2015 at 9:39 PM, Tim Peters <tim.peters@gmail.com> wrote:

> But IIUC what Lennart is complaining about

I don't, and I wish he would be more explicit about what "the

problem(s)" is(are).

> is the fact that the DST flag isn't part of and can't be embedded into a local time,

> so it's impossible to fold the second parameter to $fromlocal$ into $t$. Without

> that, a local time isn't rich enough to designate a single point in time and the

> whole edifice breaks.

You can blame Guido for that too ;-) , but in this case I disagree(d)

with him: Guido was overly (IMO) annoyed by that the only apparent

purpose for a struct tm's tm_ isdst flag was to disambiguate local

times in a relative handful of cases. His thought: an entire bit

just for that?! My thought: get over it, it's one measly bit.

IIUC, Lennart came to (a wrong IMHO) conclusion that one bit is not enough and you

must either keep datetime in UTC or store the UTC offset with datetime.

My position is that one bit is enough to disambiguate local time in all sane situations,

but the name "isdst" is misleading because discontinuities in UTC to Local function

(from now on called L(t)) may be due to causes other than DST transitions.

The math here is very simple: there are two kinds of discontinuities: you either move the

local clock forward by a certain amount or you move it back. Let's call these (unimaginatively)

discontinuities of the first and second kind.

When you have a discontinuity of the first kind, you have a range of values u for which

the equation u = L(t) has no solution for t. However, if we linearly extrapolate L(t) from before

the discontinuity forward, we get a linear function Lb(t) and we can solve u = Lb(t) for any

value of u. The problem, however is that we can also extend L(t) linearly from the time

after the discontinuity to all times and get another function La(t) which will also allow you to

solve equation u = La(t) for all times. Without user input, there is no way to tell which solution

she expects. This is the 1-bit of information that we need.

The situation with the discontinuity of the second kind is similar, but even simpler. Here,

u = L(t) has two solutions and we need 1-bit of information to disambiguate.