Как и в случае с gmtime()
и localtime()
, asctime()
и ctime()
возвращают указатели на статические буфера, которые могут быть перезаписаны после каждого вызова. Более того, эти две процедуры возвращают строки в одном и том же формате. Они отличаются лишь видом принимаемых аргументов, asctime()
и ctime()
должны использоваться тогда, когда все, что вам нужно, это простые сведения о дате и времени.
#include
#include
int main(void) {
time_t now;
time(&now);
printf("%s", ctime(& now));
}
После запуска эта программа выводит результат в виде: 'Thu May 22 15:44:21 2003
'. Завершающий символ конца строки
Рис. 6.1. Возвращаемая функциями ctime()
и asctime()
строка
Значительная часть старого кода 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 ввело стандартную библиотечную процедуру strftime()
:
#include
size_t strftime(char *s, size_t max, const char *format,
const struct tm *tm);
strftime()
сходна с sprintf()
. Ее аргументы следующие:
char *s
Буфер для форматированной строки.
size_t max
Размер буфера.
const char *format
Форматирующая строка.
const struct tm *tm
Указатель на struct tm
, представляющий разложенное время, которое надо отформатировать.
Форматирующая строка содержит символы букв, смешанные о описателями преобразования, указывающими, что должно быть помещено в строку, такими, как полное имя дня недели, час в соответствии с 24-часовым или 12-часовым циклом, наличие указателей am или p.m[64], и т.д. (Вскоре будут приведены примеры.)
Если всю строку можно отформатировать с использованием не более max
символов, возвращаемое значение представляет собой число символов, помещенных в s
, s
«неопределенно». Следующий простой пример дает представление об использовании strftime()
:
#include
#include
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()