, содержащуюся в каждой процедуре, и похоже, что эти структуры
struct tm
переписываются каждый раз, когда вызываются процедуры. Поэтому хорошая мысль сделать копию возвращенной
struct
. Возвращаясь к предыдущему примеру.
static const char *const days[] = { /* Как ранее */ };
time_t now;
struct tm curtime; /*
Структура, а не указатель */
time(&now); /* Получить текущее время */
curtime = *gmtime(&now); /* Разложить его и скопировать данные */
printf("Day of the week: %s\n", days[curtime.tm_wday]);
/* Проиндексировать и напечатать, использовать . , а не -> */
Поле
tm_isdst
указывает, действует ли в настоящий момент летнее время (DST) Значение 0 означает, что DST не действует, положительное значение означает, что действует, а отрицательное значение — что информация о DST недоступна. (Стандарт С намеренно неконкретен, указывая лишь нулевое, положительное и отрицательное значения; это дает возможность большей свободы при реализации.)
6.1.3. Форматирование даты и времени
Примеры в предыдущем разделе показали, как поля в
struct tm
могли бы быть использованы в качестве индексов символьных строк для вывода информативных значений даты и времени. Хотя можно было бы написать собственный код, использующий такие массивы для форматирования даты и времени, стандартные процедуры облегчают работу
6.1.3.1. Простое форматирование времени:
asctime
и
ctime
Две первые стандартные процедуры, перечисленные ниже, выводят данные в фиксированном формате:
#include <time.h> /* ISO С */
char *asctime(const struct tm *tm);
char *ctime(const time_t *timep);
Как и в случае с
gmtime
и
localtime
,
asctime
и
ctime
возвращают указатели на статические буфера, которые могут быть перезаписаны после каждого вызова. Более того, эти две процедуры возвращают строки в одном и том же формате. Они отличаются лишь видом принимаемых аргументов,
asctime
и
ctime
должны использоваться тогда, когда все, что вам нужно, это простые сведения о дате и времени.
#include <stdio.h>
#include <time.h>
int main(void) {
time_t now;
time(&now);
printf("%s", ctime(& now));
}
После запуска эта программа выводит результат в виде: '
Thu May 22 15:44:21 2003
'. Завершающий символ конца строки включен в результат. Точнее, возвращаемое значение указывает на массив из 26 символов, как показано на рис. 6.1.
Рис. 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 ввело стандартную библиотечную процедуру
, представляющий разложенное время, которое надо отформатировать.
Форматирующая строка содержит символы букв, смешанные о описателями преобразования, указывающими, что должно быть помещено в строку, такими, как полное имя дня недели, час в соответствии с 24-часовым или 12-часовым циклом, наличие указателей am или p.m [64] , и т.д. (Вскоре будут приведены примеры.)
64
a.m. — от ante meridiem (до полудня), p.m. — от post meridiem (пополудни), американская система обозначения 12-часового цикла времени суток. — Примеч. перев.
Если всю строку можно отформатировать с использованием не более
max
символов, возвращаемое значение представляет собой число символов, помещенных в
s
, не включая завершающий нулевой байт. В противном случае, возвращаемое значение ноль. В последнем случае содержание
s
«неопределенно». Следующий простой пример дает представление об использовании