Категории
Самые читаемые
PochitayKnigi » Компьютеры и Интернет » Интернет » Linux программирование в примерах - Роббинс Арнольд

Linux программирование в примерах - Роббинс Арнольд

Читать онлайн Linux программирование в примерах - Роббинс Арнольд

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 62 63 64 65 66 67 68 69 70 ... 253
Перейти на страницу:

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: %sn", 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: %sn", 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", а не "%sn", как можно было бы ожидать.

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, представляющий разложенное время, которое надо отформатировать.

1 ... 62 63 64 65 66 67 68 69 70 ... 253
Перейти на страницу:
Тут вы можете бесплатно читать книгу Linux программирование в примерах - Роббинс Арнольд.
Комментарии