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