strftime, wcsftime, _strftime_l, _wcsftime_l

Format a time string.

Syntax

size_t strftime(
   char *strDest,
   size_t maxsize,
   const char *format,
   const struct tm *timeptr
);
size_t _strftime_l(
   char *strDest,
   size_t maxsize,
   const char *format,
   const struct tm *timeptr,
   _locale_t locale
);
size_t wcsftime(
   wchar_t *strDest,
   size_t maxsize,
   const wchar_t *format,
   const struct tm *timeptr
);
size_t _wcsftime_l(
   wchar_t *strDest,
   size_t maxsize,
   const wchar_t *format,
   const struct tm *timeptr,
   _locale_t locale
);

Parameters

strDest
Output string.

maxsize
Size of the strDest buffer, measured in characters (char or wchar_t).

format
Format-control string.

timeptr
tm data structure.

locale
The locale to use.

Return value

strftime returns the number of characters placed in strDest and wcsftime returns the corresponding number of wide characters.

If the total number of characters, including the terminating null, is more than maxsize, both strftime and wcsftime return 0 and the contents of strDest are indeterminate.

The number of characters in strDest is equal to the number of literal characters in format, plus any characters that may be added to format via formatting codes. The terminating null of a string isn't counted in the return value.

Remarks

The strftime and wcsftime functions format the tm time value in timeptr according to the supplied format argument and store the result in the buffer strDest. At most, maxsize characters are placed in the string. For a description of the fields in the timeptr structure, see asctime. wcsftime is the wide-character equivalent of strftime; its string-pointer argument points to a wide-character string. These functions behave identically otherwise.

This function validates its parameters. If strDest, format, or timeptr is a null pointer, or if the tm data structure addressed by timeptr is invalid (for example, if it contains out of range values for the time or date), or if the format string contains an invalid formatting code, the invalid parameter handler is invoked, as described in Parameter validation. If execution is allowed to continue, the function returns 0 and sets errno to EINVAL.

By default, this function's global state is scoped to the application. To change this behavior, see Global state in the CRT.

Generic-text routine mappings

TCHAR.H routine _UNICODE and _MBCS not defined _MBCS defined _UNICODE defined
_tcsftime strftime strftime wcsftime

The format argument consists of one or more codes; as in printf, the formatting codes are preceded by a percent sign (%). Characters that don't begin with % are copied unchanged to strDest. The LC_TIME category of the current locale affects the output formatting of strftime. (For more information on LC_TIME, see setlocale.) The strftime and wcsftime functions use the currently set locale. The _strftime_l and _wcsftime_l versions of these functions are identical except that they take the locale as a parameter and use that instead of the currently set locale. For more information, see Locale.

The strftime functions support these formatting codes:

Code Replacement string
%a Abbreviated weekday name in the locale
%A Full weekday name in the locale
%b Abbreviated month name in the locale
%B Full month name in the locale
%c Date and time representation appropriate for locale
%C The year divided by 100 and truncated to an integer, as a decimal number (00−99)
%d Day of month as a decimal number (01 - 31)
%D Equivalent to %m/%d/%y
%e Day of month as a decimal number (1 - 31), where single digits are preceded by a space
%F Equivalent to %Y-%m-%d
%g The last 2 digits of the ISO 8601 week-based year as a decimal number (00 - 99)
%G The ISO 8601 week-based year as a decimal number
%h Abbreviated month name (equivalent to %b)
%H Hour in 24-hour format (00 - 23)
%I Hour in 12-hour format (01 - 12)
%j Day of the year as a decimal number (001 - 366)
%m Month as a decimal number (01 - 12)
%M Minute as a decimal number (00 - 59)
%n A newline character (\n)
%p The locale's A.M./P.M. indicator for 12-hour clock
%r The locale's 12-hour clock time
%R Equivalent to %H:%M
%S Second as a decimal number (00 - 59)
%t A horizontal tab character (\t)
%T Equivalent to %H:%M:%S, the ISO 8601 time format
%u ISO 8601 weekday as a decimal number (1 - 7; Monday is 1)
%U Week number of the year as a decimal number (00 - 53), where the first Sunday is the first day of week 1
%V ISO 8601 week number as a decimal number (00 - 53)
%w Weekday as a decimal number (0 - 6; Sunday is 0)
%W Week number of the year as a decimal number (00 - 53), where the first Monday is the first day of week 1
%x Date representation for the locale
%X Time representation for the locale
%y Year without century, as decimal number (00 - 99)
%Y Year with century, as decimal number
%z The offset from UTC in ISO 8601 format; no characters if time zone is unknown
%Z Either the locale's time-zone name or time zone abbreviation, depending on registry settings; no characters if time zone is unknown
%% Percent sign

As in the printf function, the # flag may prefix any formatting code. In that case, the meaning of the format code is changed as follows.

Format code Meaning
%#a, %#A, %#b, %#B, %#g, %#G, %#h, %#n, %#p, %#t, %#u, %#w, %#X, %#z, %#Z, %#% # flag is ignored.
%#c Long date and time representation, appropriate for the locale. For example: "Tuesday, March 14, 1995, 12:41:29".
%#x Long date representation, appropriate to the locale. For example: "Tuesday, March 14, 1995".
%#d, %#D, %#e, %#F, %#H, %#I, %#j, %#m, %#M, %#r, %#R, %#S, %#T, %#U, %#V, %#W, %#y, %#Y Remove leading zeros or spaces (if any).

The ISO 8601 week and week-based year produced by %V, %g, and %G, uses a week that begins on Monday. Week 1 is the week that contains the fourth day of January, which is the first week that includes at least four days of the year. If the first Monday of the year is the 2nd, 3rd, or 4th, the preceding days are part of the last week of the preceding year. For those days, %V is replaced by 53, and both %g and %G are replaced by the digits of the preceding year.

Note

When using one of the strftime functions with a tm pointer returned from gmtime, the values printed via the %Z and %z specifiers will not be accurate. This is because the tm struct as specified by the C Standard does not contain the information for time zone name nor offset. Instead, the timezone information is populated via the global variables _timezone and _dstbias.

Requirements

Routine Required header
strftime <time.h>
wcsftime <time.h> or <wchar.h>
_strftime_l <time.h>
_wcsftime_l <time.h> or <wchar.h>

The _strftime_l and _wcsftime_l functions are Microsoft-specific. For more compatibility information, see Compatibility.

Example

See the example for time.

See also

Locale
Time management
String manipulation
localeconv
setlocale, _wsetlocale
strcoll functions
strxfrm, wcsxfrm, _strxfrm_l, _wcsxfrm_l