time since the epoch

Peter Thiemann thiemann@informatik.uni-freiburg.de
10 Feb 2003 10:15:02 -0800


    SM> TimeDiff isn't a "duration", it's a way of specifying time offsets =
whose
    SM> duration depends on the base to which the offset is being added.  I=
f we
    SM> only had constant-duration offsets, then there would be no way to s=
ay
    SM> "give me a ClockTime for this time next Wednesday".

[nitpicking] Oops, this is not the purpose stated in the library report:
"The TimeDiff type records the difference between two clock times in a
user-readable way."=20

Anyway, the sort of specification that you are talking about is really
a pain IMHO. Actually, you could not use TimeDiff to state it,
either. [ISO8601 allows it but I think it's too imprecise to be useful]

    SM> The problem is really that all the different kinds of offset are lu=
mped
    SM> into one type: there ought to be a TimeDiffSeconds, TimeDiffMonths,=
 and
    SM> so on.  TimeDiffSeconds is a constant-duration offset, but
    SM> TimeDiffMonths isn't.  The problem with lumping them into one type =
is
    SM> that if multiple components are non-zero, you don't know in which o=
rder
    SM> to add them.

It is always a problem to lump things with different semantics into
the same type :-) What I'm arguing is that there should be only one
fixed-duration offset datatype and it should be in terms of (seconds,
picoseconds).
Other fixed durations can be easily defined in terms of this
datatype.=20
I'm still not sure that you actually want base-dependent offsets, but
again they can be easily defined on top of the fixed duration
datatype. And they should be specified separately from the base
functionality.

Certainly, differences between clock times should be in terms of the=20
fixed-duration datatype.=20

    SM> The TimeExts library gives you separate differences like
    SM> these, BTW.

That sounds good, I'll look at it again (it's pretty much bare code,
so I might have overlooked something).

    >> Unfortunately, with UTC, this goes on to make adding *anything* exce=
pt
    >> seconds to certain ClockTimes (namely the instants of leap seconds,
    >> eg, what happens if you add 1 minute to 23:59:60 ? This is a perfect=
ly
    >> legal UTC time on a day with a leap second) meaningless.

    SM> That's right, and here I'm not sure whether the right behaviour is =
to
    SM> raise an exception or to "roll over" to the next nearest date/time.=
  I
    SM> believe TimeExts does some kind of rolling over, but I'm not sure o=
f the
    SM> exact semantics (George?).

As far as I read ISO8601 (which also has a notation for durations)
this is unspecifed :-) And as far as I read TimeExts.lhs it does some
sort of rollover. My take would be to specify the behavior for adding
something like a TimeDiff to a base date in a consistent manner and
then cast that in stone. If there is a (reasonable) standard for this
kind of calculation, then this should be the basis for the specification.

    SM> Ok, ISO8601 seems to specify only constant-duration time intervals,=
 but
    SM> allows them to be given in terms of years, months, days etc., where=
 a
    SM> month is specified to be 30 days, it seems, and similar
    SM> approximations

If I remember correctly, then ISO8601 specifies durations up to a day,
but bails out at months and years.=20

    >>=20
    >> Agreed! So what is epoch? Is it
    >> "Seconds since 00:00:00 on 1 Jan 1970 [TAI]"?

    SM> I guess so... GHC's implementation will be whatever the C library u=
ses,
    SM> which I assume is the one you specified above (at least on a decent
    SM> implementation).

Unfortunately, if you are using time(2), then you'll get rubbish (from
the manual page):

DESCRIPTION
       time  returns the time since the Epoch (00:00:00 UTC, Jan=AD
       uary 1, 1970), measured in seconds.
[...]
NOTES
       POSIX.1  defines  seconds since the Epoch as a value to be
       interpreted as the number of seconds between  a  specified
       time  and the Epoch, according to a formula for conversion
       from UTC equivalent to conversion on the na=EFve basis  that
       leap  seconds are ignored and all years divisible by 4 are
       leap years.  This value is not the same as the actual num=AD
       ber  of seconds between the time and the Epoch, because of
       leap seconds and because clocks are  not  required  to  be
       synchronised  to  a  standard reference.  The intention is
       that the interpretation of seconds since the Epoch  values
       be  consistent;  see  POSIX.1  Annex  B  2.2.2 for further
       rationale.

The problem is that this notion of time is discontinuous and sometimes
not strictly increasing. See the various references pointed out by
members of the list for why this can be a problem.

-Peter

PS, I see you are trying to follow-up to haskell-cafe, but I'm not
subscribed to that list.