System.Time.Clock Design Issues

Ben Rudiak-Gould Benjamin.Rudiak-Gould at cl.cam.ac.uk
Wed Feb 2 23:56:26 EST 2005


Ashley Yakeley wrote:

 >* Can we assume that gettimeofday always returns UTC rather than TAI
 >time?
 >
 >POSIX says yes. People might set it differently, but there doesn't seem
 >to be any way of detecting that.

I'd like to mention a technique that doesn't seem to have been suggested 
yet: we can probe the configuration of the user's system at run time by 
calling gmtime and friends with preselected arguments.

In particular, the value of, say, gmtime(80000000)->tm_sec should 
suffice to distinguish between the following three cases:

    * time_t is TAI (atomic seconds since TAI epoch) and gmtime returns 
UTC (with leap seconds)

    * time_t is UTC (atomic seconds since UTC epoch) and gmtime returns 
UTC (with leap seconds)

    * gmtime is not leap-second aware

In the third case I think it's sensible to assume that gmtime returns 
UTC +/- one second, since gmtime's output (modulo 15 minutes) is what 
the user will actually see, and if it's off by 20+ seconds, either 
they'll fix it, or they don't care what second it is and neither need 
we. From that we can derive an approximate TAI (and 
seconds-since-UTC-epoch) using an internal table of leap seconds. In the 
other two cases we can use one more gmtime call to test whether the 
system's leap-second table is at least as current as ours, and use 
either the system's or ours depending on that.

I don't know if the first case actually occurs in the wild. The second 
case does occur on Linux systems which link /etc/localtime to something 
under /usr/share/zoneinfo/right/. Those people clearly care about 
accurate timekeeping and we should do what we can to cater to them.

This site was helpful:

    http://www.thedjbway.org/clockspeed/leapsecs.html

-- Ben



More information about the Libraries mailing list