strftime
| Определён в заголовочном файле <time.h>
|
||
size_t strftime( char* str, size_t count,
const char* format, const struct tm* tp );
|
(до C99) | |
size_t strftime( char* restrict str, size_t count,
const char* restrict format, const struct tm* restrict tp );
|
(начиная с C99) | |
Преобразует информацию о дате и времени из заданного календарного времени tp в строку многобайтовых символов с нулевым завершителем str в соответствии с строкой формата format. Записывается до count байтов.
Параметры
| str | - | указатель на первый элемент массива char для вывода |
| count | - | максимальное количество байтов для записи |
| format | - | указатель на строку многобайтовых символов с нулевым завершителем, задающую формат преобразования |
| tp | - | указатель на объект struct tm, задающий время для форматирования
|
Строка формата
Строка формата состоит из нуля или более спецификаторов преобразования и обычных символов (кроме %). Все обычные символы, включая завершающий нулевой символ, копируются в выходную строку без изменений. Каждая спецификация преобразования начинается с символа %, за которым может следовать модификатор E или O (игнорируется, если не поддерживается локалью), а затем символ, определяющий поведение спецификатора. Доступны следующие спецификаторы формата:
| Спецификатор преобразования |
Пояснение | Используемые поля |
|---|---|---|
%
|
записывает буквальный %. Полная спецификация преобразования должна быть %%.
|
|
n(C99) |
записывает символ новой строки | |
t(C99) |
записывает символ горизонтальной табуляции | |
| Год | ||
Y
|
записывает год как десятичное число, например 2017 | tm_year
|
EY(C99) |
записывает год в альтернативном представлении, например 平成23年 (год Хэйсэй 23) вместо 2011年 (год 2011) в локали ja_JP | tm_year
|
y
|
записывает последние 2 цифры года как десятичное число (диапазон [00,99])
|
tm_year
|
Oy(C99) |
записывает последние 2 цифры года с использованием альтернативной числовой системы, например 十一 вместо 11 в локали ja_JP | tm_year
|
Ey(C99) |
записывает год как смещение от альтернативного календарного периода локали %EC (зависит от локали)
|
tm_year
|
C(C99) |
записывает первые 2 цифры года как десятичное число (диапазон [00,99])
|
tm_year
|
EC(C99) |
записывает название базового года (периода) в альтернативном представлении локали, например 平成 (эра Хэйсэй) в ja_JP | tm_year
|
G(C99) |
записывает год по ISO 8601 на основе недели, то есть год, содержащий указанную неделю.
В ISO 8601 недели начинаются с понедельника, и первая неделя года должна удовлетворять следующим требованиям:
|
tm_year, tm_wday, tm_yday
|
g(C99) |
записывает последние 2 цифры года по ISO 8601 на основе недели, то есть года, содержащего указанную неделю (диапазон [00,99]).
В ISO 8601 недели начинаются с понедельника, и первая неделя года должна удовлетворять следующим требованиям:
|
tm_year, tm_wday, tm_yday
|
| Месяц | ||
b
|
записывает сокращённое название месяца, например Oct (зависит от локали)
|
tm_mon
|
Ob(C23) |
записывает сокращённое название месяца в альтернативном представлении локали | tm_mon
|
h(C99) |
синоним b
|
tm_mon
|
B
|
записывает полное название месяца, например October (зависит от локали)
|
tm_mon
|
OB(C23) |
записывает соответствующее полное название месяца в альтернативном представлении локали | tm_mon
|
m
|
записывает месяц как десятичное число (диапазон [01,12])
|
tm_mon
|
Om(C99) |
записывает месяц с использованием альтернативной числовой системы, например 十二 вместо 12 в локали ja_JP | tm_mon
|
| Неделя | ||
U
|
записывает номер недели в году как десятичное число (воскресенье — первый день недели) (диапазон [00,53])
|
tm_year, tm_wday, tm_yday
|
OU(C99) |
записывает номер недели в году как по %U, с использованием альтернативной числовой системы, например 五十二 вместо 52 в локали ja_JP
|
tm_year, tm_wday, tm_yday
|
W
|
записывает номер недели в году как десятичное число (понедельник — первый день недели) (диапазон [00,53])
|
tm_year, tm_wday, tm_yday
|
OW(C99) |
записывает номер недели в году как по %W, с использованием альтернативной числовой системы, например 五十二 вместо 52 в локали ja_JP
|
tm_year, tm_wday, tm_yday
|
V(C99) |
записывает номер недели по ISO 8601 (диапазон [01,53]).
В ISO 8601 недели начинаются с понедельника, и первая неделя года должна удовлетворять следующим требованиям:
|
tm_year, tm_wday, tm_yday
|
OV(C99) |
записывает номер недели в году как по %V, с использованием альтернативной числовой системы, например 五十二 вместо 52 в локали ja_JP
|
tm_year, tm_wday, tm_yday
|
| День года/месяца | ||
j
|
записывает день года как десятичное число (диапазон [001,366])
|
tm_yday
|
d
|
записывает день месяца как десятичное число (диапазон [01,31])
|
tm_mday
|
Od(C99) |
записывает день месяца с отсчётом от нуля с использованием альтернативной числовой системы, например 二十七 вместо 27 в локали ja_JP
Перед однозначным числом ставится пробел. |
tm_mday
|
e(C99) |
записывает день месяца как десятичное число (диапазон [1,31]).
Перед однозначным числом ставится пробел. |
tm_mday
|
Oe(C99) |
записывает день месяца с отсчётом от единицы с использованием альтернативной числовой системы, например 二十七 вместо 27 в локали ja_JP
Перед однозначным числом ставится пробел. |
tm_mday
|
| День недели | ||
a
|
записывает сокращённое название дня недели, например Fri (зависит от локали)
|
tm_wday
|
A
|
записывает полное название дня недели, например Friday (зависит от локали)
|
tm_wday
|
w
|
записывает день недели как десятичное число, где воскресенье — 0 (диапазон [0-6])
|
tm_wday
|
Ow(C99) |
записывает день недели, где воскресенье — 0, с использованием альтернативной числовой системы, например 二 вместо 2 в локали ja_JP
|
tm_wday
|
u(C99) |
записывает день недели как десятичное число, где понедельник — 1 (формат ISO 8601) (диапазон [1-7])
|
tm_wday
|
Ou(C99) |
записывает день недели, где понедельник — 1, с использованием альтернативной числовой системы, например 二 вместо 2 в локали ja_JP
|
tm_wday
|
| Час, минута, секунда | ||
H
|
записывает час как десятичное число, 24-часовой формат (диапазон [00-23])
|
tm_hour
|
OH(C99) |
записывает час из 24-часового формата с использованием альтернативной числовой системы, например 十八 вместо 18 в локали ja_JP | tm_hour
|
I
|
записывает час как десятичное число, 12-часовой формат (диапазон [01,12])
|
tm_hour
|
OI(C99) |
записывает час из 12-часового формата с использованием альтернативной числовой системы, например 六 вместо 06 в локали ja_JP | tm_hour
|
M
|
записывает минуту как десятичное число (диапазон [00,59])
|
tm_min
|
OM(C99) |
записывает минуту с использованием альтернативной числовой системы, например 二十五 вместо 25 в локали ja_JP | tm_min
|
S
|
записывает секунду как десятичное число (диапазон [00,60])
|
tm_sec
|
OS(C99) |
записывает секунду с использованием альтернативной числовой системы, например 二十四 вместо 24 в локали ja_JP | tm_sec
|
| Прочее | ||
c
|
записывает стандартную строку даты и времени, например Sun Oct 17 04:41:13 2010 (зависит от локали)
|
все |
Ec(C99) |
записывает альтернативную строку даты и времени, например с использованием 平成23年 (год Хэйсэй 23) вместо 2011年 (год 2011) в локали ja_JP | все |
x
|
записывает локализованное представление даты (зависит от локали) | все |
Ex(C99) |
записывает альтернативное представление даты, например с использованием 平成23年 (год Хэйсэй 23) вместо 2011年 (год 2011) в локали ja_JP | все |
X
|
записывает локализованное представление времени, например 18:40:20 или 6:40:20 PM (зависит от локали) | все |
EX(C99) |
записывает альтернативное представление времени (зависит от локали) | все |
D(C99) |
эквивалентно "%m/%d/%y" | tm_mon, tm_mday, tm_year
|
F(C99) |
эквивалентно "%Y-%m-%d" (формат даты ISO 8601) | tm_mon, tm_mday, tm_year
|
r(C99) |
записывает локализованное 12-часовое время (зависит от локали) | tm_hour, tm_min, tm_sec
|
R(C99) |
эквивалентно "%H:%M" | tm_hour, tm_min
|
T(C99) |
эквивалентно "%H:%M:%S" (формат времени ISO 8601) | tm_hour, tm_min, tm_sec
|
p
|
записывает локализованные до полудня или после полудня (зависит от локали) | tm_hour
|
z(C99) |
записывает смещение от UTC в формате ISO 8601 (например -0430), или не записывает символы, если информация о часовом поясе недоступна
|
tm_isdst
|
Z
|
записывает зависящее от локали название или аббревиатуру часового пояса, или не записывает символы, если информация о часовом поясе недоступна | tm_isdst
|
Возвращаемое значение
Количество байтов, записанных в массив символов, на который указывает str, не включая завершающий '\0', в случае успеха. Если count было достигнуто до того, как вся строка могла быть сохранена, возвращается 0, а содержимое не определено.
Пример
#include <locale.h>
#include <stdio.h>
#include <time.h>
int main(void)
{
char buff[70];
struct tm my_time =
{
.tm_year = 112, // = year 2012
.tm_mon = 9, // = 10th month
.tm_mday = 9, // = 9th day
.tm_hour = 8, // = 8 hours
.tm_min = 10, // = 10 minutes
.tm_sec = 20 // = 20 secs
};
if (strftime(buff, sizeof buff, "%A %c", &my_time))
puts(buff);
else
puts("strftime failed");
setlocale(LC_TIME, "el_GR.utf8");
if (strftime(buff, sizeof buff, "%A %c", &my_time))
puts(buff);
else
puts("strftime failed");
}
Возможный вывод:
Sunday Sun Oct 9 08:10:20 2012
Κυριακή Κυρ 09 Οκτ 2012 08:10:20 πμ EST
Ссылки
- Стандарт C23 (ISO/IEC 9899:2024):
- 7.27.3.5 Функция strftime (стр.: TBD)
- Стандарт C17 (ISO/IEC 9899:2018):
- 7.27.3.5 Функция strftime (стр.: 288-291)
- Стандарт C11 (ISO/IEC 9899:2011):
- 7.27.3.5 Функция strftime (стр.: 394-397)
- Стандарт C99 (ISO/IEC 9899:1999):
- 7.23.3.5 Функция strftime (стр.: 343-347)
- Стандарт C89/C90 (ISO/IEC 9899:1990):
- 4.12.3.5 Функция strftime
См. также
(устарело в C23)(C11) |
преобразует объект tm в текстовое представление (функция) |
(устарело в C23)(C11) |
преобразует объект time_t в текстовое представление (функция) |
(C95) |
преобразует объект tm в настраиваемое текстовое представление в широких строках (функция) |
Документация C++ для strftime
| |