int tm_min;   /* минуты */

 int tm_hour;  /* часы */

 int tm_mday;  /* день месяца */

 int tm_mon;   /* месяц */

 int tm_year;  /* год */

 int tm_wday;  /* день недели */

 int tm_yday;  /* день в году */

 int tm_isdst; /* летнее время */

};

struct tm называют разложенным временем (broken-down time), поскольку значение time_t «разложено» на свои составные части. Составные части, их диапазоны и значения показаны в табл. 6.1.

Таблица 6.1. Поля структуры tm

ЧленДиапазонЗначение
tm_sec0–60Секунда минуты. Секунда 60 предусматривает пропущенные (leap) секунды. (В C89 был диапазон 0–61.)
tm_min0–59Минута часа.
tm_hour0–23Час дня
tm_mday1–31День месяца
tm_mon0–11Месяц года
tm_year0–NГод, начиная с 1900 г.
tm_wday0–6День недели, воскресенье = 0
tm_yday0–365День года, 1 января = 0.
tm_isdst<0, 0, >0Флаг летнего времени.

Стандарт ISO С представляет большинство этих значений как «x после y». Например, tm_sec является числом «секунд после минуты», tm_mon «месяцев после января», tm_wday «дней недели после воскресенья» и т.д. Это помогает понять, почему все значения начинаются с 0. (Единственным исключением, достаточно логичным, является tm_mday, день месяца, имеющий диапазон 1–31.) Конечно, отсчет их с нуля также практичен; поскольку массивы С отсчитываются с нуля, использование этих значений в качестве индексов тривиально:

static const char *const days[] = { /* Массив имен дней */

 "Sunday", "Monday", "Tuesday", "Wednesday",

 "Thursday", "Friday", "Saturday",

};

time_t now;

struct tm *curtime;

time(&now); /* Получить текущее время */

curtime = gmtime(&now); /* Разложить его */

printf("Day of the week: %s\n", days[curtime->tm_wday]);

 /* Проиндексировать и вывести */

Как gmtime(), так и localtime() возвращают указатель на struct tm. Указатель указывает на static struct tm, содержащуюся в каждой процедуре, и похоже, что эти структуры 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 недоступна. (Стандарт С намеренно неконкретен, указывая лишь нулевое, положительное и отрицательное значения; это дает возможность большей свободы при реализации.)

<p>6.1.3. Форматирование даты и времени</p>

Примеры в предыдущем разделе показали, как поля в struct tm могли бы быть использованы в качестве индексов символьных строк для вывода информативных значений даты и времени. Хотя можно было бы написать собственный код, использующий такие массивы для форматирования даты и времени, стандартные процедуры облегчают работу

<p>6.1.3.1. Простое форматирование времени: <code>asctime()</code> и <code>ctime()</code></p>

Две первые стандартные процедуры, перечисленные ниже, выводят данные в фиксированном формате:

#include /* ISO С */

char *asctime(const struct tm *tm);

char *ctime(const time_t *timep);

Перейти на страницу:

Похожие книги