Linux программирование в примерах
Шрифт:
#include <time.h> /* ISO С */
struct tm *gmtime(const time_t *timep);
struct tm *localtime(const time_t *timep);
gmtime
возвращает указатель на struct tm
, которая представляет время UTC. localtime
возвращает указатель на struct tm
, представляющий местное время, т.е. в расчет берутся текущий часовой пояс и переход на летнее время. На самом деле это «время для настенных часов», дата и время, которые были бы отображены на настенных или ручных часах. (Как это работает, обсуждается далее в разделе 6.1.5 «Получение сведений о часовом поясе».) Обе
struct tm
, которая выглядит следующим образом: struct tm {
int tm_sec; /* секунды */
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_sec | 0–60 | Секунда минуты. Секунда 60 предусматривает пропущенные (leap) секунды. (В C89 был диапазон 0–61.) |
tm_min | 0–59 | Минута часа. |
tm_hour | 0–23 | Час дня |
tm_mday | 1–31 | День месяца |
tm_mon | 0–11 | Месяц года |
tm_year | 0–N | Год, начиная с 1900 г. |
tm_wday | 0–6 | День недели, воскресенье = 0 |
tm_yday | 0–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 недоступна. (Стандарт С намеренно неконкретен, указывая лишь нулевое, положительное и отрицательное значения; это дает возможность большей свободы при реализации.) 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.20
рейтинг книги
А. Смолин, ведьмак. Цикл
А. Смолин, ведьмак
Фантастика:
городское фэнтези
5.00
рейтинг книги
Софт. Тело (Software. Wetware)
Проза:
контркультура
5.00
рейтинг книги
Современная болгарская повесть
Проза:
современная проза
5.00
рейтинг книги
Неудержимый. Книга XII
12. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Место под солнцем
Анника Бенгтзон
Детективы:
криминальные детективы
6.00
рейтинг книги
Кодекс Охотника. Книга ХХ
20. Кодекс Охотника
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Загадка Либастьяна, или Поиски богов
7. Джокеры – Карты Творца
Фантастика:
фэнтези
9.36
рейтинг книги
История экономических учений: конспект лекций
Научно-образовательная:
история
5.00
рейтинг книги
Жизнь и приключения Мартина Чезлвита (главы I-XXVI)
Проза:
проза прочее
5.00
рейтинг книги
Тринадцатый IV
4. Видящий смерть
Фантастика:
боевая фантастика
попаданцы
6.25
рейтинг книги
Добыча. Всемирная история борьбы за нефть, деньги и власть
Документальная литература:
публицистика
5.00
рейтинг книги
Избранные произведения в одном томе
Детективы:
полицейские детективы
5.00
рейтинг книги
Глория
7.00