John Cowan wrote on 2003-01-30 13:01 UTC: > Markus Kuhn scripsit: > > > Unix timestamps have always been meant to be an encoding of a > > best-effort approximation of UTC. > > Unix is in fact older than UTC.
This is getting slightly off-topic, but Unix slowly evolved and was reimplemented various times during the first half of the 1970s and the early versions probably didn't have a clock. It didn't exist in practice outside Bell Labs before 1976. Gory details are on: http://www.bell-labs.com/history/unix/firstport.html > > They have always counted the non-leap seconds since 1970-01-01. > The Posix interpretation is only a few years old, and a break with Unix > history. Before that, time_t ticked SI seconds since the epoch (i.e. > 1970-01-01:00:00:00 GMT = 1970-01-01:00:00:10 TAI). Sorry, you just make this up. Unix machines ticked the seconds of their local oscillator from boot to shutdown. Local oscillator seconds differ from SI seconds by typically +/- 10^-5 s or worse. Unix time had multiple or fractional inserted and deleted leap seconds whenever the administrator brutally readjusted the local clock using the settimeofday(2) system call closer to UTC. Only much later in the 1980s did the Berkeley Unix version add the adjtime(2) system call to allow smooth manual adjustment towards UTC by changing the length of the Unix second relative to the local oscillator second by IIRC up to 1%. The entire question of the relation of Unix time to UTC and TAI came only up at roughly the same time as POSIX in the late 1980s when people started to get interested in time synchronization over LANs and (in Europe) DCF77 radio receivers. > The time(2) man > page in the Sixth Edition (unchanged in the Seventh) of Research > Unix says: > > .I Time > returns the time since 00:00:00 GMT, Jan. 1, 1970, measured > in seconds. Today we distinguish between "civilian" (UTC non-leap) seconds and physical (SI) seconds. The authors of that manual very obviously didn't make that distinction and you should not misrepresent them by claiming that they did. > IOW, it is a count of elapsed time since a certain moment, measured in > SI seconds, and not an encoding of anything. In practice, the source code shows that time_t values are converted to UTC clock displays without a leap second table, therefore they clearly are just meant to be an encoding of UTC clock display values and nothing else. Implementations that do anything else are purely experimental, not widely used, and can cause serious disruption in practice. > Even today, you can install the ADO (and probably GNU) packages in > either of two ways: "posix", in which there are no leap seconds and > time_t's get the POSIX interpretation you reference; and "right", in > which there are leap seconds and time_t is a count of seconds. > Try setting your TZ to "right/<whatever>" and see what you get. The so-called "right" mode in Olson's timezone library on that makes time_t an encoding of TAI+10s instead of UTC, as well as Dan Bernstein's libtai are both commonly regarded to be experimental implementations and not recommended for general use. I don't know anyone who uses TAI+10s on Unix in practice and it violates various standards. The reasons for why it shouldn't be used have been discussed in great detail on Olson's tz mailing list. You have completely misunderstood Unix time if you think that the Olson "right" configuration has anything to do with it. Markus -- Markus Kuhn, Computer Lab, Univ of Cambridge, GB http://www.cl.cam.ac.uk/~mgk25/ | __oo_O..O_oo__