[LEAPSECS] Leap seconds ain't broken, but most implementations are broken
Brooks Harris
brooks at edlmax.com
Fri Jan 6 16:09:18 EST 2017
On 2017-01-06 11:52 AM, Martin Burnicki wrote:
>
>>
>> - OS kernels with different features (Windows doesn't even know leap
>> seconds, AFAIK)
>>
>>
It is often repeated on LEAPSECS that "Windows doesn't even know leap
seconds". That's just not true. It knows very well about Leap Seconds in
the same way other systems do but it (typical desktop versions) is lazy
about when it updates - it doesn't attempt to update for Leap Seconds
until the particular system gets round to syncing to some NTP server
(defaulting to time.windows.com, but works perfectly well if set to
time.nist.gov, for example).
In Windows, FILETIME (an unsigned 64-bit value) is directly analogous to
POSIX time_t except it has a 1601-01-01 00:00:00 epoch. struct
SYSTEMTIME is analogous to POSIX struct tm ("broken down time" or
"YMDhms" representation). FileTimeToSystemTime() is analogous to POSIX
gmtime();
Like time_t, FILETIME is "bumped" when the system syncs to a NTP server.
If it were not, the YMDhms values would be incorrect by the Leap
Seconds. Of course, because it's lazy about when it syncs, FILETIME
timestamp values between the actual Leap Second and when the system has
synced are incorrect by one second.
I've experimented with this extensively to be sure I understood it. In
fact, the POSIX implementations available in the Microsoft c/c++
compilers are actually wrappers around the Windows system calls;
gmtime() calls FileTimeToSystemTime(), for example.
Meantime, local time parameters are kept in the (hated) Registry. These
are dynamically updated when a Windows Update runs (a dreaded operation
carefully avoided by people like me because those (damn) Windows Updates
too often screw up or break something else somewhere).
Now, you could say, and many of us LEAPSECS nuts would agree, "That's
horrible!". Yes, but the FILETIME value just keeps marching along and
billions of people and a bazillion applications are none the wiser. For
the most part it just keeps working. (With the occasional ctrl-alt-del,
restart, and other stupid work-arounds needed to overcome all the
operational complexities and flaws; "... as we ctrl-alt-del our way
through life..." ). [Oh! Wait, it changed! Now it's ctrl-shift-esc! Who
asked for that?!?]
Its more complicated for Windows Server versions - there you need to
coordinate many OS instances and file systems. (And Windows Server is,
in some important ways, a different animal than the typical Windows PC
version). I don't have a lot of experience with Windows Server, so I
can't explain exactly how they accomplish tighter timing, but it
obviously happens, otherwise those systems wouldn't work at all.
Note the fact that Microsoft updates Leap Seconds at midnight *local
time* in Azure. This in contrast to the common practice of introducing
Leap Seconds in local time simultaneous with UTC. They also are not
smearing. The (probably special) NTP server clicks the Leap Second and
a tightly coupled Windows system just follows. Done. The local time
results are one-second different from the "simultaneous with UTC" common
practice for some interval, but, who cares? Microsoft? Please.
The approach makes some sense to me, actually. The "simultaneous with
UTC" common practice creates a terribly complex and scattered matrix of
Leap Second appearances in local time YMDhms representations. Its hard
to calculate, and harder to verify. Introducing Leap Seconds at midnight
local time is much more managble, since each local time behaves the same
in that respect.
All this brings up a wider point; any Leap Second-to-Gregorian fix must
be applicable to many systems, not just POSIX and Linux. If broad swaths
of the markets do it different ways nothing has been accomplished. The
discussion must keep all systems, including the evil Windows, in mind.
-Brooks
More information about the LEAPSECS
mailing list