strftime - format date and time
#include <time.h>
size_t strftime(char *s, size_t max, const char *format, const struct tm *tm);
The strftime() function formats the broken-down time tm according to the format specification format and places the result in the character array s of size max.
Ordinary characters placed in the format string are copied to s without conversion. Conversion specifications are introduced by a ‘%’ character, and terminated by a conversion specifier character, and are replaced in s as follows:
Some conversion specifications can be modified by preceding the conversion specifier character by the E or O modifier to indicate that an alternative format should be used. If the alternative format or specification does not exist for the current locale, the behaviour will be as if the unmodified conversion specification were used. (SU) The Single Unix Specification mentions %Ec, %EC, %Ex, %EX, %Ey, %EY, %Od, %Oe, %OH, %OI, %Om, %OM, %OS, %Ou, %OU, %OV, %Ow, %OW, %Oy, where the effect of the O modifier is to use alternative numeric symbols (say, roman numerals), and that of the E modifier is to use a locale-dependent alternative representation.
The broken-down time structure tm is defined in <time.h>. See also ctime(3) .
The strftime() function returns the number of characters placed in the array s, not including the terminating null byte, provided the string, including the terminating null byte, fits. Otherwise, it returns 0, and the contents of the array is undefined. (Thus at least since libc 4.4.4; very old versions of libc, such as libc 4.4.1, would return max if the array was too small.)
Note that the return value 0 does not necessarily indicate an error; for example, in many locales %p yields an empty string.
The environment variables TZ and LC_TIME are used.
SVr4, C89, C99. There are strict inclusions between the set of conversions given in ANSI C (unmarked), those given in the Single Unix Specification (marked SU), those given in Olson’s timezone package (marked TZ), and those given in glibc (marked GNU), except that %+ is not supported in glibc2. On the other hand glibc2 has several more extensions. POSIX.1 only refers to ANSI C; POSIX.2 describes under date(1) several extensions that could apply to strftime() as well. The %F conversion is in C99 and POSIX.1-2001.
In SUSv2, the %S specified allowed a range of 00 to 61, to allow for the theoretical possibility of a minute that included a double leap second (there never has been such a minute).
Glibc provides some extensions for conversion specifications. (These extensions are not specified in POSIX.1-2001, but a few other systems provide similar features.) Between the % character and the conversion specifier character, an optional flag and field width may be specified. (These precede the E or O modifiers, if present.)
The following flag characters are permitted:
An optional decimal width specifier may follow the (possibly absent) flag. If the natural size of the field is smaller than this width, then the result string is padded (on the left) to the specified width.
Some buggy versions of gcc complain about the use of %c: warning: ‘%c’
yields only last 2 digits of year in some locales. Of course programmers
are encouraged to use %c, it gives the preferred date and time
representation. One meets all kinds of strange obfuscations to circumvent
this gcc problem. A relatively clean one is to add an intermediate
function
size_t my_strftime(char *s, size_t max, const char *fmt, const
struct tm *tm) {
return strftime(s, max, fmt, tm);
}
The program below can be used to experiment with strftime().
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
int
main(int argc, char *argv[])
{
char outstr[200];
time_t t;
struct tm *tmp;
t = time(NULL);
tmp = localtime(&t);
if (tmp == NULL) {
perror("localtime");
exit(EXIT_FAILURE);
}
if (strftime(outstr, sizeof(outstr)
, argv[1], tmp) == 0) {
fprintf(stderr, “strftime returned 0");
exit(EXIT_FAILURE);
}
printf("Result string is \"%s\"\n", outstr);
exit(EXIT_SUCCESS);
} /* main */
Some examples of the result string produced by the glibc implementation of strftime() are as follows:
$ ./a.out “%m"
Result string is “11"
$ ./a.out “%5m"
Result string is “00011"
$ ./a.out “%_5m"
date(1) , time(2) , ctime(3) , setlocale(3) , sprintf(3) , strptime(3)