Defect Report #136

Submission Date: 31 Mar 94
Submittor: Project Editor (P.J. Plauger)
Source: Paul Eggert
Question
Suppose I run the following program in a US environment, where the clocks will jump forward from 01:59:59 to 03:00:00 on April 3, 1994. This program attempts to invoke mktime on a struct tm that represents 02:30:00 on that date. Does the C Standard let mktime return -1 in this case?
#include <stdio.h>
#include <time.h>
int main()
{
struct tm t;
time_t r;

/*
1994-04-03 02:30:00 */
t.tm_year = 1994 - 1900; t.tm_mon = 3; t.tm_mday = 3;
t.tm_hour = 2; t.tm_min = 30; t.tm_sec = 0;

t.tm_isdst = -1; /*
i.e. unknown */

r = mktime(&t);
if (r == -1)
printf("mktime failed\n");
else
printf("%s", ctime(&r));
return 0;
}

The ANSI C Rationale (corresponding to subclause 7.12.2.3) clearly lets mktime yield -1 in the ``fall-backward fold'' that will occur when the clock is turned back from 01:59:59 to 01:00:00 on October 30, 1994. The question is whether mktime is also allowed to yield -1 in the ``spring-forward gap'' when the clock is advanced from 01:59:59 to 03:00:00.
This question arose when Arthur David Olson's popular ``tz'' time zone software was tested using NIST-PCTS:151-2, Version 1.4, (1993-12-03) a test suite put out by the National Institute of Standards and Technology that attempts to test C and Posix conformance. The PCTS package insists that in the above case, mktime must yield a time_t corresponding to either 01:30:00 or 03:30:00; i.e. PCTS rejects Olson's mktime, which yields -1.
This test case differs in an important way from the common practical use of mktime to ``add 1'' to the output of localtime or gmtime, since those functions normally set tm_isdst to a nonnegative value, whereas tm_isdst is -1 in the case under question.
I suggest that the Committee issue a clarification which makes it clear that mktime can yield -1 in the spring-forward gap when tm_isdst is -1.
Response
The Standard does not specify the behavior precisely enough to preclude mktime from returning a value of (time_t)-1 and leaving the tm_isdst member set to -1 in such situations.
Previous Defect Report < - > Next Defect Report