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)
|
I started coding up the proposed revisions to my draft. This resulted in more revisions. Now, there are only two time-related data types: a 'time' object, and seconds (as in SRFI 18). The time object has the following components: (time-second time) => real (0 to 61.0) potentially includes leap seconds (time-minute time) => integer (0 to 59) (time-hour time) => integer (0 to 23) (time-day time) => integer (1 to 31) (time-month time) => integer (1 to 12) (January=1, etc.) (time-year time) => integer (time-zone-offset time) => integer (the number of seconds east of GMT for this timezone) Implementations can vary as to whether leap seconds are included. Range is implementation specific. The 'second' object is a real, potentially inexact, corresponding to the number of seconds from 0 to implementation specific upper range, with the meaning of 0 implementation specific. ;; get the current values (current-time) (current-seconds) ;; creator (make-time second minute hour date month year zone-offset) ;; other readers (time-year-day time) => integer. Day of year (0=1/1 , etc.) (time-week-day time) => integer. Day of week (0=Sunday, etc.) (julian-day time) => real returns the Julian day, where JD 0 JD 0 designates the 24 hours from noon UTC on 1 January 4713 BC to noon UTC on 2 January 4713 BC. (modified-julian-day time) => real. Returns the modified Julian day; number of days since 17 Nov 1858 at 00:00:00 UTC. ;; writers (set-time-second! time real) (set-time-minute! time integer) (set-time-hour! time integer) (set-time-day! time integer) (set-time-month! time integer) (set-time-year! time integer) (set-time-zone-offset! time integer) ;; converters. all strings are ISO formats. (copy-time time) => time (time->seconds time) => real (seconds->time real) => time (julian-day->time real) => time (modified-julian-day->time real) => time (time->universal-time! time) => time (side-effects); converts to GMT (time->universal-time time) => time (copies) (time->string time . include-time-zone-offset?) => string (time->date-string time) => string e.g., 2000-01-31 (time->hour-string time) => string e.g. 12:34:56.789 (string->time string) => time ;; comparing procedures The comparison procedures must take the time-zone-offset into consideration. (time=? time1 time2) => boolean (time>? time1 time2) => boolean (time<? time1 time2) => boolean (time>=? time1 time2) => boolean (time<=? time1 time2) => boolean ;; data type probes (time? time) => boolean ;; time arithmetic (add-seconds! time real) => time adds number of seconds to date, side-effecting it (add-seconds time real) => time adds number of seconds to date, creating new date. Here's a summary of the changes: I dropped the 'machine time' procedures. They didn't fit very well in the overall scheme. I dropped the daylights savings time flag. I had thought this typically changed the semantics of a time object for time arithmetic, but this doesn't seem to be the case (at least for MzScheme). Besides, it's not always very usefully defined. If (current-time) needs to adjust for daylights savings time, this should be reflected in the time-zone-offset. I dropped the special 'Julian day' time object, and just made them readers on the time object. I added the 'modified Julian day' reader, which provides lower numbers (and starts at midnight). I added the time->universal-time! and time->universal-time, which takes a time object, and converts it to a 0 time-zone-offset. I added the add-seconds! and add-seconds procedures. These are procedures that allow you to add an arbitrary number of seconds to a time object. (Marc, this means your threads could run until you ran out of integers -- they might even stop using Cobol by then!). In the code I've written so far, I think all the right things happen at the time boundaries. Leap seconds are still a pain, though. I added a couple of additional string output procedures, to get just the date or the hour. I'll post the code soon. Currently, the only system dependencies are on CURRENT-SECONDS, knowing the time object corresponding to (seconds->date 0) at GMT, and probing the local time-zone-offset. I'll also begin revising the proposal in earnest.