leap seconds Marc Feeley (13 Mar 2000 17:24 UTC)
|
RE: leap seconds
Will Fitzgerald
(14 Mar 2000 14:13 UTC)
|
Re: leap seconds
Marc Feeley
(14 Mar 2000 15:32 UTC)
|
new time and date procedures
Will Fitzgerald
(05 Apr 2000 14:43 UTC)
|
more revisions
Will Fitzgerald
(07 Apr 2000 20:44 UTC)
|
Re: leap seconds
Matthias Felleisen
(16 Mar 2000 04:25 UTC)
|
Re: leap seconds
Marc Feeley
(16 Mar 2000 05:22 UTC)
|
After a very quick look at SRFI-19 I have the following comments: 1) The interface assumes that there are exactly 86400 seconds in a day. This is not true. There can be exactly 86399, 86400 and 86401 seconds in a day, due to "leap seconds". Note that the point in time where the leap seconds are added (or removed) is under the control of a committee and there is no deterministic algorithm to determine in advance where they occur (it all depends on the speed of rotation of the earth which varies slightly, up and down, due to various factor). So the "seconds" component should be in the range 0-60 inclusive. According to "man ctime" under linux, the seconds field can go up to 61, but I don't understand why that high. You should probably research this a little more. Here are some interesting sources of information: http://tycho.usno.navy.mil/leapsec.990505.html http://www.naggum.no/lugm-time.html 2) To be consistent with Scheme naming convention and practice, you should rename "get-universal-time" to "current-time", "current-universal-time", or "current-date". 3) Why limit the resolution of the time datatype to 1 second? The resolution should be implementation dependent, and if you insist, of at least 1 second resolution. This is so that an implementation can use the time datatype for finer resolution timing (such as a "(thread-sleep! wakeup-time)" procedure I am considering for my thread SRFI). Otherwise, to do finer resolution timing you need another time datatype, and this is rather clumsy. 4) I don't like the fact that the "year" component has a special meaning between 0 and 99: Year, an integer representing the year C.E. (i.e., A.D.). If the integer is between 0 and 99, however, it represents the current year + the year (if it is less than 50) or the current year - the year (if it is greater than or equal to 50). This is because the meaning of a date created with encode-universal-time will depend on the time when that procedure was called, and since there is no way to know precisely at what time it was called there are (extreme) situations where the time meant is not clear (i.e. meaning of year 50 at the turn of the year 2000 plus or minus a few nanoseconds may be 1950 or 2050). 5) Instead of the "multiple value" interface of decode-universal-time I prefer single-value accessors of the kind: (universal-time-second ut) (universal-time-minute ut) ... and also (universal-time-second ut) would return a real, possibly inexact. 6) Why use 1-1-1900 as a base, why not 1-1-1970 which is the norm under UNIX? I know this is a convention, but a closer base date gives more implementation leaway... for example a 2 fixnum representation (32 bit words, 3 tag bits) counting nanoseconds since 1-1-1900 will wraparound in 1991 but if you count from 1-1-1970 it will wraparound in 2061, which is probably reasonable for many applications. And if you insist on 1-1-1900, please consider 1-1-2000 at least. 7) The time datatype should be abstract, i.e. it shouldn't be a number. There should be conversion functions between time and seconds since the base time: (universal-time->seconds ut) (seconds->universal-time secs) Note again that the result of universal-time->seconds and the argument of seconds->universal-time should be a real, possibly inexact. For your information, Gambit-C represents the time datatype internally as a flonum, and counts the number of microseconds elapsed since the base date (so the value 15.0 means 15 microseconds since the turn of the year 1970). The advantage of this representation is that 1) computing with time (such as time comparison and difference) can be done very fast (no bignum operation is required) 2) time is represented with microsecond resolution exactly (by an inexact integer) over the range: base date +/- 285 years (because there are 53 bits of mantissa) 3) the resolution degrades gradually as the point in time get further from the base date (but frankly I don't expect Scheme to survive for 285 years, although I am sure you'll still be able to buy Cobol compilers!) Marc