Значительная часть старого кода Unix полагается на тот факт, что значения в возвращенной строке имеют фиксированную позицию. При использовании этих функций помните, что они включают завершающий символ конца строки. Поэтому наш небольшой пример программы использует для
printf
простую форматирующую строку "
%s
", а не "
%s\n
", как можно было бы ожидать.
ctime
устраняет
необходимость шага вызова
localtime
; в сущности, это эквивалентно
time_t now;
char *curtime;
time(&now);
curtime = asctime(localtime(&now));
6.1.3.2. Сложное форматирование времени:
strftime
Хотя часто достаточно использования
asctime
и
ctime
, у них есть также и ограничения:
• Формат вывода фиксирован. Нет способа изменить порядок элементов.
• В вывод не включаются сведения о часовом поясе.
• В выводе используются сокращенные названия месяца и дня.
• В выводе используются английские названия месяцев и дней.
По этим причинам C89 ввело стандартную библиотечную процедуру
, представляющий разложенное время, которое надо отформатировать.
Форматирующая строка содержит символы букв, смешанные о описателями преобразования, указывающими, что должно быть помещено в строку, такими, как полное имя дня недели, час в соответствии с 24-часовым или 12-часовым циклом, наличие указателей am или p.m [64] , и т.д. (Вскоре будут приведены примеры.)
64
a.m. — от ante meridiem (до полудня), p.m. — от post meridiem (пополудни), американская система обозначения 12-часового цикла времени суток. — Примеч. перев.
Если всю строку можно отформатировать с использованием не более
max
символов, возвращаемое значение представляет собой число символов, помещенных в
s
, не включая завершающий нулевой байт. В противном случае, возвращаемое значение ноль. В последнем случае содержание
s
«неопределенно». Следующий простой пример дает представление об использовании
strftime
:
#include <stdio.h>
#include <time.h>
int main(void) {
char buf[100];
time_t now;
struct tm *curtime;
time(&now);
curtime = localtime(&now);
(void)strftime(buf, sizeof buf,
"It is now %A, %B %d, %Y, %I:%M %p", curtime);
printf("%s\n", buf);
exit(0);
}
После
запуска эта программа выводит что-то типа:
It is now Thursday, May 22, 2003, 04:15 PM
В табл. 6.2 предоставлен полный список описателей преобразования, их возможные альтернативные представления и их значения. Вдобавок стандарт C99 добавил к списку дополнительные описатели; новые для C99 описатели помечены символом √.
Таблица 6.2. Описатели преобразования формата
strftime
Описатель
C99
Значение
%a
Локальное сокращенное название дня недели.
%A
Локальное полное название дня недели.
%b
Локальное сокращенное название месяца.
%B
Локальное полное название месяца.
%c, %Ec
Локальное «подходящее» представление даты и времени
%C, %EC
√
Век (00–99)
%d, %Od
День месяца (01–31)
%D
√
То же, что
%m/%d/%y
%e, %Oe
√
День месяца. Одна цифра дополняется пробелом (1–31).
%F
√
То же, что и
%Y-%m-%d
(формат даты ISO 8601)
%g
√
Две последние цифры, основанной на неделе года (00–99).