# New Ticket Created by  Zefram 
# Please include the string:  [perl #126121]
# in the subject line of all future correspondence about this issue. 
# <URL: https://rt.perl.org/Ticket/Display.html?id=126121 >


Reusing the function I explained in [perl #126119], let's look at 1970:

$ ./perl6 -e 'sub leaps-between ($a, $b) { (Instant.from-posix($b) - 
Instant.from-posix($a)) - ($b - $a) }; say leaps-between(0, 31536000)'
0

No leaps.  Is that right?  Not really.

In 1970 there were no leap seconds of the modern type.  But UTC was
not moving in lockstep with TAI, the way it does in a modern leapless
year such as 2014.  In fact, for the whole of 1970, each UTC second
lasted exactly 1.00000003 TAI seconds.  This is in the so-called "rubber
seconds" era of UTC.  So the 31536000 UTC seconds of 1970 lasted exactly
31536000.94608 TAI seconds, and so the leaps-between function ought to
reflect that by returning a value of exactly 0.94608 s for this interval.

Similar considerations apply throughout the period from 1961-01-01 to
1972-01-01.  In this era, the UTC second had a length slightly offset from
that of the TAI second, the offset being occasionally changed at the start
of a year.  There were also instantaneous leaps, of almost the modern
form, always at the end of a month and by some fraction of a second.
See <http://maia.usno.navy.mil/ser7/tai-utc.dat> for defining expressions.

However, this analysis depends on strictly interpreting POSIX time_t
values, for the purposes of Instant.from-posix() as being based on UTC.
This is what the POSIX standard says, but it doesn't match historical
Unix practice of the era.  If the input to Instant.from-posix() is to be
interpreted more loosely, then tai-utc.dat is not directly applicable.
But that doesn't get you off the hook: the loose interpretation is still
that time_t values are based on some form of UT, and so it still needs
to show leaps relative to TAI.  The difference is that you have greater
freedom in choosing the details of the leaps.

-zefram

Reply via email to