From: Art...@cswamp.apana.org.au (Arthur Marsh)
Path: gmd.de!nntp.gmd.de!xlink.net!howland.reston.ans.net!agate!
ihnp4.ucsd.edu!munnari.oz.au!news.uwa.edu.au!nodecg.ncc.telecomwa.oz.au!
netbsd08.dn.itg.telecom.com.au!orca1.vic.design.telecom.com.au!
picasso.cssc-syd.tansu.com.au!wabbit.cc.uow.edu.au!metro!news.cs.su.oz.au!
news.adelaide.edu.au!gateway.dircsa.org.au!cleese.apana.org.au!hal9000!
cswamp!Fredgate
Newsgroups: comp.unix.unixware
Subject: Daylight saving time in UW1.1
Message-ID: <767043120.AA04204@cswamp.apana.org.au>
Date: Fri, 22 Apr 1994 03:22:19
X-FTN-To: g...@summit.novell.com
Lines: 22

On Tue 12 Apr at 16:31 g...@summit.novell.com wrote:

 g> From: g...@summit.novell.com (George F Demarest)
 g> Message-ID: <2oeesg$...@bird.summit.novell.com>

 g> [from USG development]
 g> I don't know whether my UW1.1 machine's behavior is any 
 g> help, but it didn't advance with the changeover, either.  
 g> I quickly found that my TZ environment variable was set 
 g> to "EST5".  This value does not even admit that there is 
 g> an alternate time!  I found that /etc/TIMEZONE sets the 
 g> string.  I suspect that somehow this file was munged 
 g> when they tried to move back from the ":US/Eastern"-style 
 g> values, but I didn't pursue the issue  The right value 
 g> for NJ is "EST5EDT", for Central time, try "CST6CDT".

OK, how do we set the timezone correctly for Adelaide, which is nine and one
half hours ahead of UTC?

Arthur.

 * Origin: Camelot Swamp MJCNA, Hawthorndene, Sth Australia (8:7000/8)

Newsgroups: comp.unix.unixware
Path: bga.com!news.sprintlink.net!hookup!swrinde!cs.utexas.edu!
howland.reston.ans.net!pipex!Q.icl.co.uk!dsbc!jjf
From: j...@dsbc.icl.co.uk (J J Farrell)
Subject: Re: Daylight saving time in UW1.1
Message-ID: <Cp6IvD.Evy@dsbc.icl.co.uk>
Organization: International Computers Limited
References: <767043120.AA04204@cswamp.apana.org.au>
Date: Mon, 2 May 1994 14:28:24 GMT
Lines: 13

In article <767043120.AA04...@cswamp.apana.org.au> Art...@cswamp.apana.org.au 
(Arthur Marsh) writes:
>
>OK, how do we set the timezone correctly for Adelaide, which is nine and one
>half hours ahead of UTC?

Not sure about Adelaide, but the following should do for the Cook Islands:

	KDT9:30KST10:00,63/5:00,302/20:00

Try the environ(5) and ctime(3) man pages (obvious, eh?).


	My opinions; I do not speak for my employer.

Newsgroups: comp.unix.unixware
Path: bga.com!news.sprintlink.net!hookup!usc!howland.reston.ans.net!EU.net!
uknet!uel!msohnius
From: msohn...@novell.co.uk (Martin Sohnius)
Subject: Re: Daylight saving time in UW1.1
Sender: n...@novell.co.uk
Message-ID: <Cp9x6n.7uB@novell.co.uk>
Date: Wed, 4 May 1994 10:30:22 GMT
References: <767043120.AA04204@cswamp.apana.org.au>
Organization: Novell UNIX System Labs Europe Ltd.
X-Newsreader: TIN [version 1.2 PL0]
Lines: 67

Arthur Marsh (Art...@cswamp.apana.org.au) wrote:

: OK, how do we set the timezone correctly for Adelaide, which is nine and one
: half hours ahead of UTC?

Let me do a wide sweep on this.

UnixWare supports two different styles of timezone handling.

One is what I may call "System V" style, with the TZ environment variable
as described in environ(5).  This is the TZ that does not start with a
':'.  Jim Henderson tells me that it is very difficult to make that work
correctly anywhere in the Southern Hemisphere where they have Summer
Time.  His advice (which he also gives when teaching SCO Unix) is "change
your timezone settings manually twice a year".  For Adelaide that would be

	TZ=CST-9:30		for winter (in Oz)
	TZ=CST-10:30		for summer

Note also that the October rule for many parts of Australia ("next-to-last
Sunday in October") cannot be implemented with the "System V" style TZ.
(NB nor can the British rule, "day after 4th Saturday in October").

So, we preferably use the "Berkeley style TZ", i.e. the one which starts
with a ':'.  For Adelaide, that is:

	TZ=:Australia/South

Timezone information of this form (defined by Posix, I think, as
"implementation dependent") is read from a binary file (in this case
/usr/lib/locale/TZ/Australia/South) when needed by the time-conversion
library functions.  The utility which generates these binary files is
called zic(1M), and its manual page also describes the format of the
ASCII source files used by zic.

The source files for zic are part of the softint package in the SDK -
so you haven't got'em on a vanilla UW machine without the SDK.  However,
if you are unhappy with your current settings (or live in a part of the world
not catered for), you can create your own.  The one which includes in-
formation for Southern Australia is called /usr/lib/locale/TZ/australasia,
and makes for some amusing reading!  (Unfortunately, it's got a Sun
Microsystems Inc. copyright on it, so I can't post it here.)

The rules currently applying to Australia/South read like this:

Rule    Oz      1986    max     -       Oct     Sun<=24 2:00    1:00    -
Rule    Oz      1987    max     -       Mar     Sun<=21 3:00    0       -

Zone    Australia/South         9:30    Oz      CST

This means: "Normal time is UCT+9:30.  Set clocks one hour forward at 2am
normal time on the last Sunday on or before the 24th of Oct (i.e. "next-to-last
Sunday in Oct") and set them back to normal at 3am summer time on the third
Sunday in March.  The time zone is called CST, both summer and winter."

(Upon indeed reading the commentary in the australasia file, I must say that
I am less than certain that Adelaide, or anyone else downunder, actually
follows these rules!)

--
Martin Sohnius

Novell Labs Europe
Bracknell, England
+44-344-724031

(My opinions may not be those of Novell!)

Newsgroups: comp.unix.unixware
Path: bga.com!news.sprintlink.net!hookup!swrinde!elroy.jpl.nasa.gov!
ucla-cs!twinsun!eggert
From: egg...@twinsun.com (Paul Eggert)
Subject: Re: Daylight saving time in UW1.1
Message-ID: <CpAwFA.Lz6@twinsun.com>
Sender: use...@twinsun.com
Nntp-Posting-Host: tattoo
Organization: Twin Sun Inc, El Segundo, CA, USA
References: <767043120.AA04204@cswamp.apana.org.au> <Cp9x6n.7uB@novell.co.uk> 
<Cp6IvD.Evy@dsbc.icl.co.uk>
Date: Wed, 4 May 1994 23:11:32 GMT
Lines: 71

Arthur Marsh (Art...@cswamp.apana.org.au) writes:
> OK, how do we set the timezone correctly for Adelaide, which is nine and one
> half hours ahead of UTC?

j...@dsbc.icl.co.uk (J J Farrell) replies:
> Not sure about Adelaide, but the following should do for the Cook Islands:
>	KDT9:30KST10:00,63/5:00,302/20:00

Even if that works this year, it won't work next year.  Your best bet
is to install Arthur David Olson's most recent time zone tables, which
you can FTP from elsie.nci.nih.gov in pub/tz*.  (The UW 1.1 tables are
ancient and less complete.)  E.g. for the Cook Islands you'd set
TZ=':Pacific/Rarotonga' which would use the following rule taken from
the `australasia' source file:

# Cook Is
# Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
Rule	Cook	1978	only	-	Nov	12	0:00	0:30	HD
Rule	Cook	1979	max	-	Mar	Sun>=1	0:00	0	H
Rule	Cook	1979	max	-	Oct	lastSun	0:00	0:30	HD
# Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
Zone Pacific/Rarotonga	-10:39:04 -	LMT	1901		# Avarua
			-10:30	-	CIST	1978 Nov 12	# Cook Is ST
			-10:00	Cook	T%sT


msohn...@novell.co.uk (Martin Sohnius) also replies that the tz table

> which includes information for Southern Australia is called
> /usr/lib/locale/TZ/australasia, and makes for some amusing reading!
> (Unfortunately, it's got a Sun Microsystems Inc. copyright on it,
> so I can't post it here.)

That's odd: /usr/share/lib/zoneinfo/australasia _doesn't_ have a Sun
copyright notice in Solaris 2.3.  The Sun copyright notices in some of
the related files (e.g. northamerica) are a bit bogus, since that data
was derived from an ancient version of Olson's tables, and Sun's
changes are minimal.  Better to go to the source.  Here is Olson's
latest table for Adelaide, which you'd use by setting
TZ=':Australia/Adelaide'.  Australian time zone rules tend to change a
lot, so if you have any corrections please mail them to
t...@elsie.nci.nih.gov for general use in the future.

# Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
Rule	Aus	1895	only	-	Jan	 1	0:00	0	-
# Shanks gives 1917 Jan 1 0:01; go with Whitman (and guess 2:00).
Rule	Aus	1916	only	-	Oct	 1	2:00	1:00	-
Rule	Aus	1917	only	-	Mar	25	2:00	0	-
Rule	Aus	1942	only	-	Jan	 1	2:00	1:00	-
Rule	Aus	1942	only	-	Mar	29	2:00	0	-
Rule	Aus	1942	only	-	Sep	27	2:00	1:00	-
Rule	Aus	1943	1944	-	Mar	lastSun	2:00	0	-
Rule	Aus	1943	only	-	Oct	 3	2:00	1:00	-
# Whitman says W Australia didn't use DST in 1943/1944, and that
# 1944/1945 was just like 1943/1944; go with Shanks.

# Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
Rule	AS	1971	1985	-	Oct	lastSun	2:00	1:00	-
Rule	AS	1986	only	-	Oct	19	2:00	1:00	-
Rule	AS	1987	max	-	Oct	lastSun	2:00	1:00	-
Rule	AS	1972	only	-	Feb	27	3:00	0	-
Rule	AS	1973	1985	-	Mar	Sun>=1	3:00	0	-
Rule	AS	1986	1989	-	Mar	Sun>=15	3:00	0	-
Rule	AS	1990	max	even	Mar	Sun>=22	3:00	0	-
Rule	AS	1990	max	odd	Mar	Sun>=1	3:00	0	-
# Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
Zone Australia/Adelaide	9:14:20 -	LMT	1895 Feb
			9:00	-	CST	1899 May
			9:30	-	CST	1917 Jan 1 0:01
			9:30	Aus	CST	1971 Oct lastSun 2:00
			9:30	AS	CST

Newsgroups: comp.unix.unixware
Path: gmd.de!nntp.gmd.de!xlink.net!howland.reston.ans.net!EU.net!uknet!uel!
msohnius
From: msohn...@novell.co.uk (Martin Sohnius)
Subject: Re: Daylight saving time in UW1.1
Sender: n...@novell.co.uk
Message-ID: <CpC896.53r@novell.co.uk>
Date: Thu, 5 May 1994 16:24:42 GMT
References: <767043120.AA04204@cswamp.apana.org.au> <Cp9x6n.7uB@novell.co.uk> 
<Cp6IvD.Evy@dsbc.icl.co.uk> <CpAwFA.Lz6@twinsun.com>
Organization: Novell UNIX System Labs Europe Ltd.
X-Newsreader: TIN [version 1.2 PL0]
Lines: 110

Paul Eggert (egg...@twinsun.com) wrote:
: Arthur Marsh (Art...@cswamp.apana.org.au) writes:
: > OK, how do we set the timezone correctly for Adelaide, which is nine and one
: > half hours ahead of UTC?

: j...@dsbc.icl.co.uk (J J Farrell) replies:
: > Not sure about Adelaide, but the following should do for the Cook Islands:
: >	KDT9:30KST10:00,63/5:00,302/20:00

: Even if that works this year, it won't work next year.  Your best bet
: is to install Arthur David Olson's most recent time zone tables, which
: you can FTP from elsie.nci.nih.gov in pub/tz*.  (The UW 1.1 tables are
: ancient and less complete.)  E.g. for the Cook Islands you'd set
: TZ=':Pacific/Rarotonga' which would use the following rule taken from
: the `australasia' source file:

: # Cook Is
: # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
: Rule	Cook	1978	only	-	Nov	12	0:00	0:30	HD
: Rule	Cook	1979	max	-	Mar	Sun>=1	0:00	0	H
: Rule	Cook	1979	max	-	Oct	lastSun	0:00	0:30	HD
: # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
: Zone Pacific/Rarotonga	-10:39:04 -	LMT	1901		# Avarua
: 			-10:30	-	CIST	1978 Nov 12	# Cook Is ST
: 			-10:00	Cook	T%sT


: msohn...@novell.co.uk (Martin Sohnius) also replies that the tz table

: > which includes information for Southern Australia is called
: > /usr/lib/locale/TZ/australasia, and makes for some amusing reading!
: > (Unfortunately, it's got a Sun Microsystems Inc. copyright on it,
: > so I can't post it here.)

: That's odd: /usr/share/lib/zoneinfo/australasia _doesn't_ have a Sun
: copyright notice in Solaris 2.3.  The Sun copyright notices in some of
: the related files (e.g. northamerica) are a bit bogus, since that data
: was derived from an ancient version of Olson's tables, and Sun's
: changes are minimal.  Better to go to the source.  Here is Olson's
: latest table for Adelaide, which you'd use by setting
: TZ=':Australia/Adelaide'.  Australian time zone rules tend to change a
: lot, so if you have any corrections please mail them to
: t...@elsie.nci.nih.gov for general use in the future.

: # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
: Rule	Aus	1895	only	-	Jan	 1	0:00	0	-
: # Shanks gives 1917 Jan 1 0:01; go with Whitman (and guess 2:00).
: Rule	Aus	1916	only	-	Oct	 1	2:00	1:00	-
: Rule	Aus	1917	only	-	Mar	25	2:00	0	-
: Rule	Aus	1942	only	-	Jan	 1	2:00	1:00	-
: Rule	Aus	1942	only	-	Mar	29	2:00	0	-
: Rule	Aus	1942	only	-	Sep	27	2:00	1:00	-
: Rule	Aus	1943	1944	-	Mar	lastSun	2:00	0	-
: Rule	Aus	1943	only	-	Oct	 3	2:00	1:00	-
: # Whitman says W Australia didn't use DST in 1943/1944, and that
: # 1944/1945 was just like 1943/1944; go with Shanks.

: # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
: Rule	AS	1971	1985	-	Oct	lastSun	2:00	1:00	-
: Rule	AS	1986	only	-	Oct	19	2:00	1:00	-
: Rule	AS	1987	max	-	Oct	lastSun	2:00	1:00	-
: Rule	AS	1972	only	-	Feb	27	3:00	0	-
: Rule	AS	1973	1985	-	Mar	Sun>=1	3:00	0	-
: Rule	AS	1986	1989	-	Mar	Sun>=15	3:00	0	-
: Rule	AS	1990	max	even	Mar	Sun>=22	3:00	0	-
: Rule	AS	1990	max	odd	Mar	Sun>=1	3:00	0	-
: # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
: Zone Australia/Adelaide	9:14:20 -	LMT	1895 Feb
: 			9:00	-	CST	1899 May
: 			9:30	-	CST	1917 Jan 1 0:01
: 			9:30	Aus	CST	1971 Oct lastSun 2:00
: 			9:30	AS	CST

I sure hit a hornet's nest here.  Actually, Andrew Josey dug out for me
the exchanges that had gone on in the SVR4 newsgroup in November 1990 on 
the general subject of Olson's method (yes, I now know the name).

Apparently, very few things stir the imagination, and the keyboard urge, as
much as fiddling around with time.  What seems to happen with respect to
zic source, is that someone, at some point, downloads the most up-to-date
version, puts it into the code (with or without some copyright -- and
believe me, the ones on UW1.1 do have Sun copyrights), ships it and
forgets it.  Hence even 1.1.1 still ships with "Oct lastSun" for UK-Eire.
(I filed the bug long ago, complete with the info sheet from Her Majesty's
Nautical Almanac Office at the Royal Greenwich Observatory.)

More seriously:  it's very nice to be able to look up whether summer time
was in force in 1066, but please, please comment out all that stuff before
running zic.  Unix clocks start at 00:00 GMT (as it was then called) on
1970 Jan 1.  No time conversion on the system will need anything before that,
and for that matter, why do you need to know whether summer time was in 
force even last year?  Where does it matter?

Put in the current rules and keep the compiled files small.  they need to be
read in and digested by the various library functions.  Don't bloat them.

PS.  Anyone contemplated the fact that before 1928 or thereabouts, Astronomical
     Time changed the date at noon?  Feel like implementing TZ=:Astronomy?

PPS.  What ever happened to leap seconds?  A UnixWare machine booted in
      Jan.1970 would be 12 seconds fast today! Major software project lurking.

--
Martin Sohnius

Novell Labs Europe
Bracknell, England
+44-344-724031

(My opinions may not be those of Novell!)

Newsgroups: comp.unix.unixware
Path: bga.com!news.sprintlink.net!rtp.vnet.net!news1.digex.net!
news.intercon.com!panix!MathWorks.Com!europa.eng.gtefsd.com!
howland.reston.ans.net!usc!elroy.jpl.nasa.gov!ucla-cs!twinsun!eggert
From: egg...@twinsun.com (Paul Eggert)
Subject: Re: Daylight saving time in UW1.1
Message-ID: <CpGx5v.ADL@twinsun.com>
Sender: use...@twinsun.com
Nntp-Posting-Host: twinsun
Organization: Twin Sun Inc, El Segundo, CA, USA
References: <767043120.AA04204@cswamp.apana.org.au> <Cp9x6n.7uB@novell.co.uk> 
<Cp6IvD.Evy@dsbc.icl.co.uk> <CpAwFA.Lz6@twinsun.com> <CpC896.53r@novell.co.uk>
Date: Sun, 8 May 1994 05:13:06 GMT
Lines: 61

msohn...@novell.co.uk (Martin Sohnius) writes:

> Unix clocks start at 00:00 GMT (as it was then called) on 1970 Jan 1.

Perhaps _some_ Unix clocks start on that date, I think the more popular
ones start in 1901.  For example, on Solaris 2.3 (sparc), `zdump -v'
outputs `Fri Dec 13 20:45:52 1901 GMT' as the earliest time.  This
is because time_t is signed.

> why do you need to know whether summer time was in force even last year?

It matters when you're dealing with historical databases, and you'd be
surprised how many people care about these things.  For example, a
well-known bug in Ingres causes it to botch the question of whether
summer time was in force last year, and every so often someone
complains about it in comp.databases.ingres.  For applications ranging
from medical records to retrospective stock market analysis, it's
important to get dates _and_ times right.

> Put in the current rules and keep the compiled files small.  they need to be
> read in and digested by the various library functions.  Don't bloat them.

That's bad advice.  The full Adelaide rules that I posted go all the
way back to 1885, when Adelaide first switched to standard time; if you
put in just the current rules, you'll handle times before 1990
incorrectly and you will save (on my host, anyway) _zero_ disk space
and main memory.  The difference between the sizes of the compiled
files for Adelaide is only 712 bytes -- which happens to be less than a
disk fragment -- and the programs that read those tables have fixed
size buffers that are already much bigger than the full Adelaide
table.  I haven't bothered to measure the difference in CPU time
between `date' with the full table and `date' with the truncated table;
the difference would be so small that it would be hard to measure.

> Anyone contemplated the fact that before 1928 or thereabouts, Astronomical
> Time changed the date at noon?  Feel like implementing TZ=:Astronomy?

That change didn't affect civil time, which is what we're talking about here.

>PPS.  What ever happened to leap seconds?

The current Olson code and database supports leap seconds.
This hasn't been picked up by many vendors, since the Posix
committee (in one of its more chuckleheaded decisions) mandated
that a host must behave as if leap seconds don't exist.
In response, the Olson code has a compatibility mode contributed by
Bradley White of CMU, in which the actual clock works correctly, but
you can inquire about the time in Posix mode and get the wrong answer
that Posix requires; but this seems to be too complicated for many vendors.
(It's sort of like dealing with DOS time-of-day clocks, in its own
funny way.)  Some agile vendors ship with leap second support, and I
believe some more forward-looking distributors even have it turned on
by default, but the bigger, slower-moving vendors make you go to some
lengths to use it if they support it at all.

> A UnixWare machine booted in Jan.1970 would be 12 seconds fast today!

Actually, 18 leap seconds have been inserted since January 1972.
Leap seconds didn't exist before then, but I'd guess your hypothetical
machine would be around 20 seconds fast today, unless you converted
it to use the Olson leapsecond code.

Path: bga.com!news.sprintlink.net!hookup!usc!rand.org!edhall
From: edh...@nntp.rand.org (Ed Hall)
Newsgroups: comp.unix.unixware
Subject: Re: Daylight saving time in UW1.1
Date: 9 May 1994 18:42:04 GMT
Organization: RAND Corporation
Lines: 42
Message-ID: <2qm05s$3ra@rand.org>
References: <767043120.AA04204@cswamp.apana.org.au> <Cp9x6n.7uB@novell.co.uk> 
<Cp6IvD.Evy@dsbc.icl.co.uk> <CpAwFA.Lz6@twinsun.com> <CpC896.53r@novell.co.uk> 
<CpGx5v.ADL@twinsun.com>
NNTP-Posting-Host: ives.rand.org
X-Newsreader: TIN [version 1.2 PL2]

Paul Eggert (egg...@twinsun.com) wrote:
: msohn...@novell.co.uk (Martin Sohnius) writes:

: > Unix clocks start at 00:00 GMT (as it was then called) on 1970 Jan 1.

: Perhaps _some_ Unix clocks start on that date, I think the more popular
: ones start in 1901.  For example, on Solaris 2.3 (sparc), `zdump -v'
: outputs `Fri Dec 13 20:45:52 1901 GMT' as the earliest time.  This
: is because time_t is signed.

That's negative time.  The "epoch" is 1970 Jan 1 UTC, as Martin said.  The
reason time_t is signed is so time values can be compared with simple
arithmetic, not so they can represent pre-1970 dates (which would break
such computations).  Some folks have noticed that time_t is signed, and
decided to make time go backwards, but I sort of doubt this was Thompson
and Ritchie's intent.

If you want to be pedantic, Unix clocks "start" at 1970 Jan 1 UTC, and
some Unix clocks run both ways from there.

: > Put in the current rules and keep the compiled files small.  they need to be
: > read in and digested by the various library functions.  Don't bloat them.

: That's bad advice.  The full Adelaide rules that I posted go all the
: way back to 1885, when Adelaide first switched to standard time; if you
: put in just the current rules, you'll handle times before 1990
: incorrectly and you will save (on my host, anyway) _zero_ disk space
: and main memory.  The difference between the sizes of the compiled
: files for Adelaide is only 712 bytes -- which happens to be less than a
: disk fragment -- and the programs that read those tables have fixed
: size buffers that are already much bigger than the full Adelaide
: table.  I haven't bothered to measure the difference in CPU time
: between `date' with the full table and `date' with the truncated table;
: the difference would be so small that it would be hard to measure.

No, I think it's good advice, given that the various ctime(3) routines
are affected.  An application might wind up calling them thousands of
times, and even though the timezone information is read in only once,
it still adds processing to every call.

		-Ed Hall
		edh...@rand.org

Path: bga.com!news.sprintlink.net!sundog.tiac.net!usenet.elf.com!rpi!usc!
howland.reston.ans.net!news.cac.psu.edu!news.pop.psu.edu!psuvax1!rutgers!
ucla-cs!twinsun!eggert
From: egg...@twinsun.com (Paul Eggert)
Newsgroups: comp.unix.unixware
Subject: Re: Daylight saving time in UW1.1
Message-ID: <CpKIo1.JDz@twinsun.com>
Date: 10 May 94 03:50:23 GMT
References: <767043120.AA04204@cswamp.apana.org.au> <Cp9x6n.7uB@novell.co.uk> 
<Cp6IvD.Evy@dsbc.icl.co.uk> <CpAwFA.Lz6@twinsun.com> <CpC896.53r@novell.co.uk> 
<CpGx5v.ADL@twinsun.com> <2qm05s$3ra@rand.org>
Sender: use...@twinsun.com
Organization: Twin Sun Inc, El Segundo, CA, USA
Lines: 50
Nntp-Posting-Host: tattoo

edh...@nntp.rand.org (Ed Hall) writes:

> The reason time_t is signed is so time values can be compared with simple
> arithmetic, not so they can represent pre-1970 dates

Unsigned values can be compared just as quickly as signed values --
it's a single machine instruction in both cases, on any architecture in
current use.

> Some folks have noticed that time_t is signed, and
> decided to make time go backwards, but I sort of doubt this was Thompson
> and Ritchie's intent.

I doubt whether they cared all that much, but K&R _did_ make time_t signed.
Most vendors these days treat negative time_t values as
times before 1970, since it's the natural interpretation.
(The only other possible interpretation is to make them illegal,
which causes its own set of problems.)

The relevant standards (ANSI C, Posix) don't state whether time_t is signed,
but all vendors that I know of have followed K&R's lead and kept time_t signed.

> An application might wind up calling them thousands of
> times, and even though the timezone information is read in only once,
> it still adds processing to every call.

Come on, the overhead here is negligible in any realistic application.
Let's take an extreme worst case.  Suppose a programmer came to me
and said, ``My application invokes `time(&t), ctime(&t)' 1000 times
per second, and using the full Adelaide table costs an extra 200
microseconds per ctime() call, so I'll get a 25% speedup by going with
the truncated table, and besides I *know* that no program on my host
will ever need to handle dates before 1990 properly, so I want to use
the truncated table.'' Then my answer would be:

	1.  Why are you invoking `ctime' 1000 times per second?
	Isn't it a lot cheaper to invoke it at most once per second,
	and cache the result?  This will speed up your program
	far more than truncating the Adelaide table would, and it
	will speed things up even with less complicated time zone rules.

	2.  How do you know that no other program on your host needs to
	handle dates before 1990 properly?  If you're not sure, then
	perhaps you should create a truncated table just for your
	application, while keeping the full table as the default.
	This is easy to do with environment variables
	(e.g. TZ=':/full/path/to/truncated/Adelaide/table').

	3.  Really, your best bet is to leave well enough alone,
	and stick with the correct time zone table rather than mangling it.