Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP
Path: utzoo!watmath!clyde!cbatt!cbosgd!ucbvax!ucbcad!nike!lll-crg!seismo!ut-sally!std-unix
From: std-u...@ut-sally.UUCP (Moderator, John Quarterman)
Newsgroups: mod.std.unix
Subject: IEEE 1003.1 P.55
Message-ID: <5836@ut-sally.UUCP>
Date: Mon, 29-Sep-86 15:14:18 EDT
Article-I.D.: ut-sally.5836
Posted: Mon Sep 29 15:14:18 1986
Date-Received: Tue, 30-Sep-86 15:07:04 EDT
Organization: IEEE 1003 Portable Operating System for Computer Environments Committee
Lines: 118
Approved: j...@sally.utexas.edu

There are several decisions needed regarding timezones and 1003.1:

Which proposal should be accepted (P.55 or the one forthcoming from HP)?

If P.55:
Accept settz 4.5.3?
Add 4.5.4 or incorporate third paragraph in 4.5.3?
Details of Errors and References.
Suggested Appendices:
	Olsen's implementation?
	List of names of timezones?

The rest of this article is the text of Proposal 55.

IEEE 1003.1 P.55:

Time Zone Proposal based on work by Robert Elz and Arthur Olsen.
Submitted by John S. Quarterman.  Proposal number assigned 19 Sept. 1986.

Add 4.5.3 and 4.5.4 to the standard and perhaps also
document Arthur Olsen's implementation in an Appendix.

Note that all of 4.5.4 except the last paragraph of 4.5.4.2, the last
sentence of 4.5.4.3, and all of 4.5.4.4 and 4.5.4.5, is intended to
track X3J11.  I.e., the purpose of 4.5.4 is to constrain ctime() and
localtime() further than X3J11, not to change what X3J11 says about them.

% is used to indicate the section sign.  Italics are implied in the
normal format of the POSIX document.


4.5.3	Set Local Time Conversion
Function:  settz()

4.5.3.1	Synopsis
	int settz(p)
	char *p;

4.5.3.2	Description
	The settz() function determines the conversion from GMT
of the local times returned by localtime() and ctime().
When called with a NULL pointer argument (p==0), settz
shall select the appropriate local time conversion for the
location of the host machine on which the call is executed.
When called with a null string (p!=0 && *p=='\0'), settz
shall select no conversion for localtime, making localtime()
and gmtime() equivalent and ctime() and asctime(gmtime())
equivalent.  When called with a non-null string (p!=0 && *p!='\0'),
settz may set the conversion according to that string.
The format of the string and the conversions it may specify
are implementation specific.  If an implementation accepts
non-null string arguments to settz, the implementation
should allow users to define their own conversions
rather than restricting conversions to a standard set.
If settz is called with a string for which the implementation
can not find a conversion, settz shall return -1, but the
conversion it sets is implementation defined and may be one of
GMT, the executing machine's local time, or local time for
the area where the implementation was performed.

4.5.3.3	Returns
	Upon successful completion, settz() returns 0, otherwise -1,
and errno is set to indicate the error.

4.5.3.4  Errors
	If the function returns -1 the value stored in errno may be
interpreted as follows:

[EFAULT]	The argument p points outside the process's allocated
	addresss space.

4.5.3.5  References
time() %4.5.1, localtime(), ctime() %4.5.4.


4.5.4  Get Local Time
Functions:  localtime(), ctime()

4.5.4.1  Synopsis
	#include <time.h>

	struct tm *localtime(timer)
	char *ctime(timer)
	time_t *timer;

4.5.4.2  Description
	The localtime() function converts the calendar time pointed to
by timer to local time in the form of a string.  It is equivalent to
	asctime(localtime(timer))

	The local time conversion is specified by a call on settz().
If localtime() or ctime() is called and settz() has not been called
since the last exec(), the localtime() or ctime() call shall call
settz(getenv("TZ")) before performing the local time conversion.
The local time conversion should be accurate for all times
from the base time of the time() function up to the time
the call is made.  Future times should be converted as accurately
as possible with available political information.  Daylight savings
time should be taken into account in both cases.

4.5.4.3  Returns
	The localtime() function returns a pointer to that object.
	The ctime() function returns the pointer returned by the
asctime() function with that broken-down time as argument.
	On unsuccessful completion of either function, a NULL pointer
shall be returned and errno is set to indicate the error.

4.5.4.4  Errors
	If either function returns a NULL pointer the value stored in
errno may be interpreted as follows:

[EFAULT]	The argument points outside the process's allocated
	address space.

4.5.4.5  References
time() %4.5.1, settz() %4.5.3.

Volume-Number: Volume 7, Number 8

Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP
Path: utzoo!watmath!clyde!caip!elbereth!rutgers!im4u!ut-sally!std-unix
From: std-u...@ut-sally.UUCP (Moderator, John Quarterman)
Newsgroups: mod.std.unix
Subject: Re: IEEE 1003.1 P.55
Message-ID: <5846@ut-sally.UUCP>
Date: Tue, 30-Sep-86 12:11:06 EDT
Article-I.D.: ut-sally.5846
Posted: Tue Sep 30 12:11:06 1986
Date-Received: Wed, 1-Oct-86 06:20:18 EDT
References: <5836@ut-sally.UUCP>
Organization: IEEE 1003 Portable Operating System for Computer Environments Committee
Lines: 58
Approved: j...@sally.utexas.edu

From: seismo!elsie!ado (Arthur Olson)
Date: Mon, 29 Sep 86 22:46:41 EDT

A few words regarding the "P.55" time zone proposal.

One thing it lacks is a way of determining the "time zone abbreviation"
("EST" or "EDT" or "EWT", for example) to be used with a particular combination
of time and time zone.  One approach is to declare a global variable such as
	char *	tz_abbr;
and have "localtime" set it to point to the abbreviation for the converted time.
Alternately, some folks have suggested adding either a character pointer or a
character array to the "struct tm" that "localtime" returns as a way of
recording the abbreviation.  The approach used isn't too important;
standardizing the approach is.  (Avoiding changes to the "struct tm" structure
would be desirable if there are applications that have stored such structures
in files.  I don't know of--and can't imagine--applications that do so.)

If the standard *does* end up telling how a caller of localtime can learn the
abbreviation for the converted time, then a change may be needed in the
passage reading

> When called with a null string (p!=0 && *p=='\0'), settz
> shall select no conversion for localtime, making localtime()
> and gmtime() equivalent and ctime() and asctime(gmtime())
> equivalent.

If, for example, "localtime" sets "tz_abbr" as a side effect, but "gmtime"
doesn't, then calling "localtime" and calling "gmtime" can never be equivalent.

It may be simplest to just leave the settz("") case out of the standard
entirely--any application programmer who's interested in getting GMT can
just call gmtime() directly.  (The settz("") case is actually a bone to throw
to speedsters who don't want "ls" to get time conversion information from
disk; while this has some value, the value may well be too small to warrant
standardization.)  But having settz((char *) 0) set things for local time
(regardless, for example, of the state of the environment variable "TZ")
provides a capability that's important to programs such as uucp;
the behavior of settz((char *) 0) *should*, I believe, be documented.

Concretely:  I'd suggest this shortening of section 4.5.3.2:
	4.5.3.2	Description
	The settz() function determines the conversion from GMT
	of the local times returned by localtime() and ctime().
	When called with a null pointer argument (p==0), settz
	shall select the appropriate local time conversion for the
	location of the host machine on which the call is executed.
	When called with a non-null pointer argument (p!=0),
	settz may set the conversion according to that string...

And, perhaps, an addition along these lines to 4.5.4.3 (or wherever):
	As a side effect, both ctime and localtime set the global character
	pointer tz_abbr to point to the time zone abbreviation for the
	converted time and time zone.
--
	UUCP: ..decvax!seismo!elsie!ado   ARPA: elsie!...@seismo.ARPA
	DEC, VAX, Elsie & Ado are Digital, Borden & Ampex trademarks.

Volume-Number: Volume 7, Number 10