1STRFTIME(3) Linux Programmer's Manual STRFTIME(3)
2
3
4
6 strftime - format date and time
7
9 #include <time.h>
10
11 size_t strftime(char *restrict s, size_t max,
12 const char *restrict format,
13 const struct tm *restrict tm);
14
16 The strftime() function formats the broken-down time tm according to
17 the format specification format and places the result in the character
18 array s of size max. The broken-down time structure tm is defined in
19 <time.h>. See also ctime(3).
20
21 The format specification is a null-terminated string and may contain
22 special character sequences called conversion specifications, each of
23 which is introduced by a '%' character and terminated by some other
24 character known as a conversion specifier character. All other charac‐
25 ter sequences are ordinary character sequences.
26
27 The characters of ordinary character sequences (including the null
28 byte) are copied verbatim from format to s. However, the characters of
29 conversion specifications are replaced as shown in the list below. In
30 this list, the field(s) employed from the tm structure are also shown.
31
32 %a The abbreviated name of the day of the week according to the
33 current locale. (Calculated from tm_wday.) (The specific names
34 used in the current locale can be obtained by calling nl_lang‐
35 info(3) with ABDAY_{1–7} as an argument.)
36
37 %A The full name of the day of the week according to the current
38 locale. (Calculated from tm_wday.) (The specific names used in
39 the current locale can be obtained by calling nl_langinfo(3)
40 with DAY_{1–7} as an argument.)
41
42 %b The abbreviated month name according to the current locale.
43 (Calculated from tm_mon.) (The specific names used in the cur‐
44 rent locale can be obtained by calling nl_langinfo(3) with AB‐
45 MON_{1–12} as an argument.)
46
47 %B The full month name according to the current locale. (Calcu‐
48 lated from tm_mon.) (The specific names used in the current lo‐
49 cale can be obtained by calling nl_langinfo(3) with MON_{1–12}
50 as an argument.)
51
52 %c The preferred date and time representation for the current lo‐
53 cale. (The specific format used in the current locale can be
54 obtained by calling nl_langinfo(3) with D_T_FMT as an argument
55 for the %c conversion specification, and with ERA_D_T_FMT for
56 the %Ec conversion specification.) (In the POSIX locale this is
57 equivalent to %a %b %e %H:%M:%S %Y.)
58
59 %C The century number (year/100) as a 2-digit integer. (SU) (The
60 %EC conversion specification corresponds to the name of the
61 era.) (Calculated from tm_year.)
62
63 %d The day of the month as a decimal number (range 01 to 31).
64 (Calculated from tm_mday.)
65
66 %D Equivalent to %m/%d/%y. (Yecch—for Americans only. Americans
67 should note that in other countries %d/%m/%y is rather common.
68 This means that in international context this format is ambigu‐
69 ous and should not be used.) (SU)
70
71 %e Like %d, the day of the month as a decimal number, but a leading
72 zero is replaced by a space. (SU) (Calculated from tm_mday.)
73
74 %E Modifier: use alternative ("era-based") format, see below. (SU)
75
76 %F Equivalent to %Y-%m-%d (the ISO 8601 date format). (C99)
77
78 %G The ISO 8601 week-based year (see NOTES) with century as a deci‐
79 mal number. The 4-digit year corresponding to the ISO week num‐
80 ber (see %V). This has the same format and value as %Y, except
81 that if the ISO week number belongs to the previous or next
82 year, that year is used instead. (TZ) (Calculated from tm_year,
83 tm_yday, and tm_wday.)
84
85 %g Like %G, but without century, that is, with a 2-digit year
86 (00–99). (TZ) (Calculated from tm_year, tm_yday, and tm_wday.)
87
88 %h Equivalent to %b. (SU)
89
90 %H The hour as a decimal number using a 24-hour clock (range 00 to
91 23). (Calculated from tm_hour.)
92
93 %I The hour as a decimal number using a 12-hour clock (range 01 to
94 12). (Calculated from tm_hour.)
95
96 %j The day of the year as a decimal number (range 001 to 366).
97 (Calculated from tm_yday.)
98
99 %k The hour (24-hour clock) as a decimal number (range 0 to 23);
100 single digits are preceded by a blank. (See also %H.) (Calcu‐
101 lated from tm_hour.) (TZ)
102
103 %l The hour (12-hour clock) as a decimal number (range 1 to 12);
104 single digits are preceded by a blank. (See also %I.) (Calcu‐
105 lated from tm_hour.) (TZ)
106
107 %m The month as a decimal number (range 01 to 12). (Calculated
108 from tm_mon.)
109
110 %M The minute as a decimal number (range 00 to 59). (Calculated
111 from tm_min.)
112
113 %n A newline character. (SU)
114
115 %O Modifier: use alternative numeric symbols, see below. (SU)
116
117 %p Either "AM" or "PM" according to the given time value, or the
118 corresponding strings for the current locale. Noon is treated
119 as "PM" and midnight as "AM". (Calculated from tm_hour.) (The
120 specific string representations used for "AM" and "PM" in the
121 current locale can be obtained by calling nl_langinfo(3) with
122 AM_STR and PM_STR, respectively.)
123
124 %P Like %p but in lowercase: "am" or "pm" or a corresponding string
125 for the current locale. (Calculated from tm_hour.) (GNU)
126
127 %r The time in a.m. or p.m. notation. (SU) (The specific format
128 used in the current locale can be obtained by calling nl_lang‐
129 info(3) with T_FMT_AMPM as an argument.) (In the POSIX locale
130 this is equivalent to %I:%M:%S %p.)
131
132 %R The time in 24-hour notation (%H:%M). (SU) For a version in‐
133 cluding the seconds, see %T below.
134
135 %s The number of seconds since the Epoch, 1970-01-01 00:00:00 +0000
136 (UTC). (TZ) (Calculated from mktime(tm).)
137
138 %S The second as a decimal number (range 00 to 60). (The range is
139 up to 60 to allow for occasional leap seconds.) (Calculated
140 from tm_sec.)
141
142 %t A tab character. (SU)
143
144 %T The time in 24-hour notation (%H:%M:%S). (SU)
145
146 %u The day of the week as a decimal, range 1 to 7, Monday being 1.
147 See also %w. (Calculated from tm_wday.) (SU)
148
149 %U The week number of the current year as a decimal number, range
150 00 to 53, starting with the first Sunday as the first day of
151 week 01. See also %V and %W. (Calculated from tm_yday and
152 tm_wday.)
153
154 %V The ISO 8601 week number (see NOTES) of the current year as a
155 decimal number, range 01 to 53, where week 1 is the first week
156 that has at least 4 days in the new year. See also %U and %W.
157 (Calculated from tm_year, tm_yday, and tm_wday.) (SU)
158
159 %w The day of the week as a decimal, range 0 to 6, Sunday being 0.
160 See also %u. (Calculated from tm_wday.)
161
162 %W The week number of the current year as a decimal number, range
163 00 to 53, starting with the first Monday as the first day of
164 week 01. (Calculated from tm_yday and tm_wday.)
165
166 %x The preferred date representation for the current locale without
167 the time. (The specific format used in the current locale can
168 be obtained by calling nl_langinfo(3) with D_FMT as an argument
169 for the %x conversion specification, and with ERA_D_FMT for the
170 %Ex conversion specification.) (In the POSIX locale this is
171 equivalent to %m/%d/%y.)
172
173 %X The preferred time representation for the current locale without
174 the date. (The specific format used in the current locale can
175 be obtained by calling nl_langinfo(3) with T_FMT as an argument
176 for the %X conversion specification, and with ERA_T_FMT for the
177 %EX conversion specification.) (In the POSIX locale this is
178 equivalent to %H:%M:%S.)
179
180 %y The year as a decimal number without a century (range 00 to 99).
181 (The %Ey conversion specification corresponds to the year since
182 the beginning of the era denoted by the %EC conversion specifi‐
183 cation.) (Calculated from tm_year)
184
185 %Y The year as a decimal number including the century. (The %EY
186 conversion specification corresponds to the full alternative
187 year representation.) (Calculated from tm_year)
188
189 %z The +hhmm or -hhmm numeric timezone (that is, the hour and
190 minute offset from UTC). (SU)
191
192 %Z The timezone name or abbreviation.
193
194 %+ The date and time in date(1) format. (TZ) (Not supported in
195 glibc2.)
196
197 %% A literal '%' character.
198
199 Some conversion specifications can be modified by preceding the conver‐
200 sion specifier character by the E or O modifier to indicate that an al‐
201 ternative format should be used. If the alternative format or specifi‐
202 cation does not exist for the current locale, the behavior will be as
203 if the unmodified conversion specification were used. (SU) The Single
204 UNIX Specification mentions %Ec, %EC, %Ex, %EX, %Ey, %EY, %Od, %Oe,
205 %OH, %OI, %Om, %OM, %OS, %Ou, %OU, %OV, %Ow, %OW, %Oy, where the effect
206 of the O modifier is to use alternative numeric symbols (say, roman nu‐
207 merals), and that of the E modifier is to use a locale-dependent alter‐
208 native representation. The rules governing date representation with
209 the E modifier can be obtained by supplying ERA as an argument to a
210 nl_langinfo(3). One example of such alternative forms is the Japanese
211 era calendar scheme in the ja_JP glibc locale.
212
214 Provided that the result string, including the terminating null byte,
215 does not exceed max bytes, strftime() returns the number of bytes (ex‐
216 cluding the terminating null byte) placed in the array s. If the
217 length of the result string (including the terminating null byte) would
218 exceed max bytes, then strftime() returns 0, and the contents of the
219 array are undefined.
220
221 Note that the return value 0 does not necessarily indicate an error.
222 For example, in many locales %p yields an empty string. An empty for‐
223 mat string will likewise yield an empty string.
224
226 The environment variables TZ and LC_TIME are used.
227
229 For an explanation of the terms used in this section, see at‐
230 tributes(7).
231
232 ┌─────────────────────────────────┬───────────────┬────────────────────┐
233 │Interface │ Attribute │ Value │
234 ├─────────────────────────────────┼───────────────┼────────────────────┤
235 │strftime() │ Thread safety │ MT-Safe env locale │
236 └─────────────────────────────────┴───────────────┴────────────────────┘
237
239 SVr4, C89, C99. There are strict inclusions between the set of conver‐
240 sions given in ANSI C (unmarked), those given in the Single UNIX Speci‐
241 fication (marked SU), those given in Olson's timezone package (marked
242 TZ), and those given in glibc (marked GNU), except that %+ is not sup‐
243 ported in glibc2. On the other hand glibc2 has several more exten‐
244 sions. POSIX.1 only refers to ANSI C; POSIX.2 describes under date(1)
245 several extensions that could apply to strftime() as well. The %F con‐
246 version is in C99 and POSIX.1-2001.
247
248 In SUSv2, the %S specifier allowed a range of 00 to 61, to allow for
249 the theoretical possibility of a minute that included a double leap
250 second (there never has been such a minute).
251
253 ISO 8601 week dates
254 %G, %g, and %V yield values calculated from the week-based year defined
255 by the ISO 8601 standard. In this system, weeks start on a Monday, and
256 are numbered from 01, for the first week, up to 52 or 53, for the last
257 week. Week 1 is the first week where four or more days fall within the
258 new year (or, synonymously, week 01 is: the first week of the year that
259 contains a Thursday; or, the week that has 4 January in it). When
260 three or fewer days of the first calendar week of the new year fall
261 within that year, then the ISO 8601 week-based system counts those days
262 as part of week 52 or 53 of the preceding year. For example, 1 January
263 2010 is a Friday, meaning that just three days of that calendar week
264 fall in 2010. Thus, the ISO 8601 week-based system considers these
265 days to be part of week 53 (%V) of the year 2009 (%G); week 01 of
266 ISO 8601 year 2010 starts on Monday, 4 January 2010. Similarly, the
267 first two days of January 2011 are considered to be part of week 52 of
268 the year 2010.
269
270 Glibc notes
271 Glibc provides some extensions for conversion specifications. (These
272 extensions are not specified in POSIX.1-2001, but a few other systems
273 provide similar features.) Between the '%' character and the conver‐
274 sion specifier character, an optional flag and field width may be spec‐
275 ified. (These precede the E or O modifiers, if present.)
276
277 The following flag characters are permitted:
278
279 _ (underscore) Pad a numeric result string with spaces.
280
281 - (dash) Do not pad a numeric result string.
282
283 0 Pad a numeric result string with zeros even if the conversion
284 specifier character uses space-padding by default.
285
286 ^ Convert alphabetic characters in result string to uppercase.
287
288 # Swap the case of the result string. (This flag works only with
289 certain conversion specifier characters, and of these, it is on‐
290 ly really useful with %Z.)
291
292 An optional decimal width specifier may follow the (possibly absent)
293 flag. If the natural size of the field is smaller than this width,
294 then the result string is padded (on the left) to the specified width.
295
297 If the output string would exceed max bytes, errno is not set. This
298 makes it impossible to distinguish this error case from cases where the
299 format string legitimately produces a zero-length output string.
300 POSIX.1-2001 does not specify any errno settings for strftime().
301
302 Some buggy versions of gcc(1) complain about the use of %c: warning:
303 `%c' yields only last 2 digits of year in some locales. Of course pro‐
304 grammers are encouraged to use %c, as it gives the preferred date and
305 time representation. One meets all kinds of strange obfuscations to
306 circumvent this gcc(1) problem. A relatively clean one is to add an
307 intermediate function
308
309 size_t
310 my_strftime(char *s, size_t max, const char *fmt,
311 const struct tm *tm)
312 {
313 return strftime(s, max, fmt, tm);
314 }
315
316 Nowadays, gcc(1) provides the -Wno-format-y2k option to prevent the
317 warning, so that the above workaround is no longer required.
318
320 RFC 2822-compliant date format (with an English locale for %a and %b)
321
322 "%a, %d %b %Y %T %z"
323
324 RFC 822-compliant date format (with an English locale for %a and %b)
325
326 "%a, %d %b %y %T %z"
327
328 Example program
329 The program below can be used to experiment with strftime().
330
331 Some examples of the result string produced by the glibc implementation
332 of strftime() are as follows:
333
334 $ ./a.out '%m'
335 Result string is "11"
336 $ ./a.out '%5m'
337 Result string is "00011"
338 $ ./a.out '%_5m'
339 Result string is " 11"
340
341 Program source
342
343 #include <time.h>
344 #include <stdio.h>
345 #include <stdlib.h>
346
347 int
348 main(int argc, char *argv[])
349 {
350 char outstr[200];
351 time_t t;
352 struct tm *tmp;
353
354 t = time(NULL);
355 tmp = localtime(&t);
356 if (tmp == NULL) {
357 perror("localtime");
358 exit(EXIT_FAILURE);
359 }
360
361 if (strftime(outstr, sizeof(outstr), argv[1], tmp) == 0) {
362 fprintf(stderr, "strftime returned 0");
363 exit(EXIT_FAILURE);
364 }
365
366 printf("Result string is \"%s\"\n", outstr);
367 exit(EXIT_SUCCESS);
368 }
369
371 date(1), time(2), ctime(3), nl_langinfo(3), setlocale(3), sprintf(3),
372 strptime(3)
373
375 This page is part of release 5.12 of the Linux man-pages project. A
376 description of the project, information about reporting bugs, and the
377 latest version of this page, can be found at
378 https://www.kernel.org/doc/man-pages/.
379
380
381
382GNU 2021-03-22 STRFTIME(3)