Linux программирование в примерах
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(). Указатель указывает на staticstruct tm, содержащуюся в каждой процедуре, и похоже, что эти структурыstruct tmпереписываются каждый раз, когда вызываются процедуры. Поэтому хорошая мысль сделать копию возвращеннойstruct tm. Возвращаясь к предыдущему примеру.structstatic 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]);/* Проиндексировать и напечатать, использовать . , а не -> */Поле
указывает, действует ли в настоящий момент летнее время (DST) Значение 0 означает, что DST не действует, положительное значение означает, что действует, а отрицательное значение — что информация о DST недоступна. (Стандарт С намеренно неконкретен, указывая лишь нулевое, положительное и отрицательное значения; это дает возможность большей свободы при реализации.)tm_isdst6.1.3. Форматирование даты и времени
Примеры в предыдущем разделе показали, как поля в
могли бы быть использованы в качестве индексов символьных строк для вывода информативных значений даты и времени. Хотя можно было бы написать собственный код, использующий такие массивы для форматирования даты и времени, стандартные процедуры облегчают работуstruct tm6.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));}После запуска эта программа выводит результат в виде: '
'. Завершающий символ конца строки включен в результат. Точнее, возвращаемое значение указывает на массив из 26 символов, как показано на рис. 6.1.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 <time.h> /* ISO С */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