pne: A picture of a plush toy, halfway between a duck and a platypus, with a green body and a yellow bill and feet. (Default)
[personal profile] pne

I thought that while time_t need not be an unsigned 32-bit integer (it could also be a 64-bit integer, for example, or even a double-precision floating-point number), it has to be (a) an arithmetic type that (b) represents seconds since some epoch.

Apparently, only (a) is correct; AFAICT, the standard does not make any requirement about the encoding, not even that one "unit" is a second, only that (time_t)-1 has a special meaning. So it could be, for example, a 64-bit count of milliseconds since some epoch. Subtracting two time_t values and expecting the result to make any specific sense is, therefore, unportable; you have to use difftime() for that (which is documented to return a count of seconds as a double-precision floating-point number, no matter what "time_t" is encoded like).

Date: Thursday, 28 July 2005 13:53 (UTC)
From: [identity profile] mendel.livejournal.com
Hrm. difftime(3) tells me:
    NOTES
           This  function is required by ANSI C.  On a POSIX system, time_t is an
           arithmetic type, and one could just define
                  #define difftime(t1,t0) (double)(t1 - t0)
           when the possible overflow in the subtraction is not a concern.
So it sounds as though POSIX requires the unit of time_t to be seconds. The POSIX time_t is documented here (http://www.opengroup.org/onlinepubs/009695399/basedefs/sys/types.h.html). From that:
    time_t
         Used for time in seconds.
So on a POSIX system you're guaranteed that time_t is measured in seconds. Now, granted, difftime gets rid of having to cast a time_t to a double, but I don't think existing code will break because of problems comparing two time_t's provided the system is POSIX compliant.

"Seconds since the Epoch" is defined here (http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap04.html#tag_04_14), though, and that confirms that you can't rely on the Epoch being 1970-01-01 00:00:00 UTC:
    The relationship between the actual time of day and the current value for seconds 
    since the Epoch is unspecified.

Date: Thursday, 28 July 2005 13:57 (UTC)
From: [identity profile] mendel.livejournal.com
Oh, wait! There's a simpler problem here. You wrote
it has to be (a) an arithmetic type that (b) represents seconds since some epoch.
We've already seen that (a) is true in POSIX. As for (b), I think you've just confused the time_t type with time(2) or gettimeofday(2). Obviously a variable of type time_t can contain any value within range; it's just a variable.
ext_78: A picture of a plush animal. It looks a bit like a cross between a duck and a platypus. (Default)
From: [identity profile] pne.livejournal.com
I think you've just confused the time_t type with time(2) or gettimeofday(2). Obviously a variable of type time_t can contain any value within range; it's just a variable.

No, I did mean time_t in the context of a return value of time(2) -- as in, given two return values of time(2) at different periods in time, can you subtract them and obtain a meaningful answer?

What made me ask myself the question was an email which stated that "both Windows and POSIX define time_t to be in seconds" but that "As a side note, ISO C does not define the format of time_t, so an
implementation that used millisecond values would be ISO C compliant,
just not POSIX compliant."

Which you appear to have confirmed: POSIX says that one time_t "unit" is a second, but this is not part of the C standard itself -- which only says that I said (viz., that it's an arithmetic type used to represent time).
From: [identity profile] mendel.livejournal.com
No, I did mean time_t in the context of a return value of time(2) -- as in, given two return values of time(2) at different periods in time, can you subtract them and obtain a meaningful answer?

Right, you mean the return value of time(2), and you don't mean time_t. If time(2) returned double your question would be exactly the same.
ext_78: A picture of a plush animal. It looks a bit like a cross between a duck and a platypus. (Default)
From: [identity profile] pne.livejournal.com
Right, you mean the return value of time(2), and you don't mean time_t. If time(2) returned double your question would be exactly the same.

Essentially, yes. Whatever semi-opaque token time(3) and mktime(3) and timegm(3) and friends return and that can be passed to ctime(3) and localtime(3) and friends. Which happens to be time_t, and which is typically the only way this type is used.

The question was how opaque this shared token is: in POSIX, it's fairly transparent (number of seconds), but the C standard itself makes no such guarantee.

Profile

pne: A picture of a plush toy, halfway between a duck and a platypus, with a green body and a yellow bill and feet. (Default)
Philip Newton

June 2015

S M T W T F S
 12 3456
78910111213
14151617181920
2122232425 2627
282930    

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Friday, 2 January 2026 00:51
Powered by Dreamwidth Studios