6.1.2. Разложение времени: gmtime() и localtime()

6.1.2. Разложение времени: gmtime() и localtime()

На практике форма представления даты и времени в виде «секунд с начала эпохи» не является очень удобной, кроме очень простых сравнений. Самостоятельное вычисление компонентов времени, таких, как месяц, день, год и т.д., подвержено ошибкам, поскольку необходимо принять во внимание местный часовой пояс (возможно, с учетом перехода на летнее время), правильно вычислить високосные годы и пр. К счастью, две стандартные процедуры делают за вас эту работу:

#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 ", 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 ", days[curtime.tm_wday]);

 /* Проиндексировать и напечатать, использовать . , а не -> */

Поле tm_isdst указывает, действует ли в настоящий момент летнее время (DST) Значение 0 означает, что DST не действует, положительное значение означает, что действует, а отрицательное значение — что информация о DST недоступна. (Стандарт С намеренно неконкретен, указывая лишь нулевое, положительное и отрицательное значения; это дает возможность большей свободы при реализации.)

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Машина времени

Из книги Журнал `Компьютерра` N740 автора Журнал «Компьютерра»

Машина времени Автор: Олег ВолошинЛюбой производитель спит и видит, как бы вырваться вперед, создать что-то такое, что отличит его детище от сонма других. В случае с цифровыми камерами, выпускаемыми в колоссальном избытке, это становится особенно актуально —


Линейка времени

Из книги Запись CD и DVD: профессиональный подход автора Бахур Виктор

Линейка времени На линейке времени окна редактора в часах, минутах, секундах и миллисекундах отображается время (рис. 4.11). Когда мы прослушиваем запись, то всегда можем определить, сколько времени прошло с начала воспроизведения. Для этого достаточно посмотреть на


Разложение по стопкам

Из книги Компьютер на 100. Начинаем с Windows Vista автора Зозуля Юрий

Разложение по стопкам При выборе режима разложения по стопкам файлы в папке упорядочиваются в виде стопок по значениям выбранного свойства (рис. 2.42). Для применения этого режима просмотра щелкните кнопкой мыши на стрелке справа от нужного заголовка и выполните команду


Разложение по стопкам

Из книги Windows Vista автора Вавилов Сергей

Разложение по стопкам Разложение по стопкам подразумевает организацию файлов текущей папки и всех ее вложенных каталогов в виде стопок по определенному признаку, за который отвечает один из столбцов. Щелкните кнопкой мыши на стрелке заголовка столбца, по значениям


1.6.13. Правило экономии: время программиста стоит дорого; поэтому экономия его времени более приоритетна по сравнению с экономией машинного времени

Из книги Искусство программирования для Unix автора Реймонд Эрик Стивен

1.6.13. Правило экономии: время программиста стоит дорого; поэтому экономия его времени более приоритетна по сравнению с экономией машинного времени "В ранние мини-компьютерные времена Unix" вынесенная в заголовок идея была довольно радикальной (машины тогда работали


1.6.13. Правило экономии: время программиста стоит дорого; поэтому экономия его времени более приоритетна по сравнению с экономией машинного времени

Из книги Искусство программирования для Unix автора Реймонд Эрик Стивен

1.6.13. Правило экономии: время программиста стоит дорого; поэтому экономия его времени более приоритетна по сравнению с экономией машинного времени "В ранние мини-компьютерные времена Unix" вынесенная в заголовок идея была довольно радикальной (машины тогда работали


Сложение гармоник и разложение на гармонические составляющие

Из книги OrCAD PSpice. Анализ электрических цепей автора Кеоун Дж.

Сложение гармоник и разложение на гармонические составляющие Создадим новый входной файл, соответствующий рис. 7.4, на котором к схеме рис. 7.1 добавлены еще два независимых источника тока. Мы использовали два источника только для того, чтобы вы могли получить основную и


18.1.1. Представление времени

Из книги Разработка приложений в среде Linux. Второе издание автора Джонсон Майкл К.

18.1.1. Представление времени В системах Unix и Linux время отслеживается в секундах до или после начала эпохи, которое определяется как полночь 1 января 1970 года по UTC[148]. Положительные значения времени относятся к периоду после начала эпохи; отрицательные — до начала эпохи. Для


Пример 12-37. Разложение числа на простые множители

Из книги Искусство программирования на языке сценариев командной оболочки автора Купер Мендель

Пример 12-37. Разложение числа на простые множители #!/bin/bash# factr.sh: Разложение числа на простые множителиMIN=2 # Не работает с числами меньше 2.E_NOARGS=65E_TOOSMALL=66if [ -z $1 ]then echo "Порядок использования: $0 number" exit $E_NOARGSfiif [ "$1" -lt "$MIN" ]then echo "Исходное число должно быть больше или равно $MIN."


Течение времени

Из книги Новый ум короля [О компьютерах, мышлении и законах физики] автора Пенроуз Роджер


12.1. Ограничения по времени

Из книги Установка, настройка и восстановление Windows 7 на 100% автора Ватаманюк Александр Иванович

12.1. Ограничения по времени После выбора этой ссылки появится сетка ограничений по времени на каждый день недели. Настройка ограничений производится очень просто: необходимо щелкнуть кнопкой мыши на пересечении дня недели и нужного времени суток, что приведет к


Квант времени

Из книги Разработка ядра Linux автора Лав Роберт

Квант времени Квант времени (timeslice[20]) — это численное значение, которое характеризует, как долго может выполняться задание до того момента, пока оно не будет вытеснено. Стратегия планирования должна устанавливать значение кванта времени, используемое по умолчанию, что


Немного времени

Из книги Как приручить компьютер за несколько часов автора Ремнева Ирина

Немного времени Игра «О счастливчик»Игрок: Прошу убрать два неверных варианта.Ведущий: Итак, дорогой компьютер, уберите, пожалуйста, два неверных варианта.Надпись на мониторах: «Программа выполнила недопустимую ошибку и будет закрыта».Ведущий: Что ж, по просьбе компании