[tz] [PROPOSED 2/2] strftime: conform better to POSIX+

Paul Eggert eggert at cs.ucla.edu
Sun Aug 9 07:03:55 UTC 2020

On 8/8/20 3:01 PM, Robert Elz wrote:

> It turns out not to matter here really, as it is trivial to arrange that
> a successful call always returns >= 1, leaving 0 to always mean that
> an error occurred (after which errno can be checked).

It's not that easy in general-purpose functions that call strerror. The tzdb's 
date.c program, for example, does this:

		cp[0] = '\1';
		result = strftime(cp, size, format, tmp);
		if (result != 0 || cp[0] == '\0')
			/* strftime worked */;

and this relies on undocumented but we-hope-portable-in-practice properties of 
strftime. If we knew that strftime preserved errno on a successful return of 0, 
we could make this code use that property and it'd be portable and easier to 

One can work around the problem by allocating memory for a larger format (take 
the original format and prepend a space, then strip a leading space from the 
output), but that's awkward and inefficient and hardly anybody does it. Really, 
the strftime API needs to be fixed.

I submitted a bug report to POSIX about this, here:


which proposes that errno should be preserved on successful returns of 0 from 
strftime. As it happens, Dennis Wölfing already reported the same spec bug here:


I hope that the POSIX committee accepts one or the other of the suggested changes.

More information about the tz mailing list