[LEAPSECS] Common Calendar Time (CCT) -Brooks Harris
Brooks Harris
brooks at edlmax.com
Sat Jan 18 18:49:11 EST 2014
On 2014-01-18 03:07 PM, Eric R. Smith wrote:
> On 2014-01-18 12:02, Joseph Gwinn wrote:
>>> [POSIX time]
> ...
>>> It's defined as a transformation of a broken-down UTC timestamp, not
>>> (despite its name) as a count of seconds since some instant.
>> No. If your poke around into how time is used, you will discover that
>> what is stored in the cound of seconds since the Epoch. Broken-down
>> time is used only when there is a human to be humored.
> A count of "non-leap seconds" since the Epoch. That is a crucial
> difference, and it's (IMHO) the root cause of many leap second problems.
Its an *uncompensated-for-leap-seconds* Gregorian calendar counting
scheme. I've never seen it described that way, but that's what it is.
> time_t presents itself as "elapsed time", and is frequently used that
> way, but it is not elapsed time in the usual meaning of the term (i.e.
> number of elapsed SI seconds).
>
> It's frustrating, because POSIX comes really close to providing both of
> the aspects of time (elapsed duration and civil time) that applications
> require. It wisely provides a human readable time structure (struct tm),
> and functions to convert this to and from time_t,
Its not just human readable - its a representation of time_t in YY-MM-DD
hh:mm:ss form.
> but then requires
> time_t to satisfy a simple formula so that the conversion between struct
> tm and time_t is fixed.
gmtime() performs a "break-down" of time_t to YY-MM-DD hh:mm:ss. Its the
inverse of the formula defined in 4.15 Seconds Since the Epoch -
tm_sec + tm_min*60 + tm_hour*3600 + tm_yday*86400 +
(tm_year−70)*31536000 + ((tm_year−69)/4)*86400 −
((tm_year−1)/100)*86400 + ((tm_year+299)/400)*86400
This is an *uncompensated-for-leap-seconds* Gregorian calendar counting
scheme with an artificially imposed "1970" ("the Epoch") "origin". I
like to call it the 1970 *barrier*.
> If it just dropped that formula and required use
> of library functions to convert time_t to/from struct tm then it would
> at least be possible to implement time_t as a true count of elapsed
> seconds on a POSIX compliant system.
gmtime() will "do the right thing" (for dates after 1972) if you adjust
time_t by Leap-Seconds-in-effect.
It gets more squirrelly when doing localtime()....
But, CAUTION - not all implementations of gmtime() are equally good.
I've compiled and tested many versions from the open-source community
and many have smoking gun errors. Outright bugs don't help confidence in
consistent implementation and contribute to the confusion.
>
> Alas, there are difficulties with this too -- leap seconds are
> unpredictable, and interchange of file timestamps between POSIX systems
> becomes harder. Maybe the way forward would be to introduce a new
> "elapsedtime_t" type that really does count seconds since the Epoch (to
> be used in any applications that require duration) and to deprecate
> arithmetic on time_t values (which is problematic around leap seconds).
Yes, generally. Getting ANSI c and POSIX standards bodies to change
their ways is an uphill battle. Convincing some parts of the
time-keeping community that uses POSIX and derivatives might be more
feasible if a clear specification existed.
-Brooks
>
> Eric
>
> _______________________________________________
> LEAPSECS mailing list
> LEAPSECS at leapsecond.com
> http://six.pairlist.net/mailman/listinfo/leapsecs
>
>
More information about the LEAPSECS
mailing list