Oracle actually has the most elegant Gregorian time manipulation
implementation I've seen. The only operations it really supports are
add_months and add_days. Year +/- can be implemented with add_months*12.
All of add_<week|hour|minute|second|ms|us|ns> can be synthesized from
add_days. This scarcity of operations yields the elegance, and is
perfect for an instruction set. Based on that model, I'd suggest:

    gmclock(out Nx)
        UTC clock in seconds since 0000 hrs Jan 1, 2000, ignoring leap
        seconds.

    gmtime(out Px, in Nx)
        Splits date up like Perl 5 gmtime. (But without annoying y -= 
        1900 and m -= 1?)

    localtime(out Px, in Nx)
        Splits date up like Perl 5 localtime. (But without annoying y -=

        1900 and m -= 1?)

    add_months(out Nx, in Ny, in Nz)
        Sets x to y + z months.

That's the minimal core set of operations.

But the redundancy of gmtime and localtime has always bothered me, so I
could see this instead:

    gmclock(out Nx)
        UTC clock in seconds since 0000 hrs Jan 1, 2000, ignoring leap
        seconds.

    tolocal out Nx, out Iy, in Nz
        x is set to z converted to the local time zone. y <- 1 if 
        Daylight Savings Time was in effect at z; y <- 0 otherwise.

    splittime Px, Nx
        Splits date up like Perl 5 gmtime. (But without annoying y -= 
        1900 and m -= 1?)

    add_months(out Nx, in Ny, in Nz)
        Sets x to y + z months.



By contrast, date manipulation in Perl 5 is truly horrid. I've seen
modules which turned a gmtime array back into an epoch-base value by
using localtime to converge on the correct value using progressive
approximation, as if finding the root of an arbitrary mathematical
function. Doing the same using the above instructions can easily be
implemented in 17 instructions flat with no branches:

    # out Nx: clock-style seconds-since-epoch
    # in Py: splittime-style array
    # Nz: temp 
    
    Nx = 0
    
    # years
    Nz = Py[5]
    Nz = Nz - 2000    # epoch based at year 2000
    Nz = Nz * 12      # = months per year
    add_months Nx, Nx, Nz
    
    # months
    Nz = Py[4]
    add_months Nx, Nx, Nz
    
    # days
    Nz = Py[3]
    Nz = Nz * 86400  # = 24 * 60 * 60 seconds per day
    Nx = Nx + Nz
    
    # hours
    Nz = Py[2]
    Nz = Nz * 3600   # = 60 * 60 seconds per hour
    Nx = Nx + Nz
    
    # minutes
    Nz = Py[1]
    Nz = Nz * 60     # = 60 seconds per minute
    Nx = Nx + Nz
    
    # seconds
    Nz = Py[0]
    Nx = Nx + Nz


Leave parsing and formatting entirely to libraries. Absolutely no need
for that in the instruction set.

-- 

Gordon Henriksen
IT Manager
ICLUBcentral Inc.
[EMAIL PROTECTED]

Reply via email to