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

18.1.2. Преобразование, форматирование и разбор значений времени

18.1.2. Преобразование, форматирование и разбор значений времени

Для взаимно-обратных преобразований времени, выраженного в показателях time_t, и времени, выраженного в показателях struct tm, используются четыре функции. Три из них являются стандартными и доступны во всех системах Linux и Unix. Четвертая, не менее полезная, может применяться не всегда, поскольку она работает только в современных системах Linux. Пятая функция (стандартная) вычисляет разность в секундах между значениями времени time_t. (Обратите внимание на то, что даже аргументы time_t передаются как указатели, а не как только аргументы struct tm.)

struct tm * gmtime(const time_t *t)

Сокращенная форма времени по Гринвичу; функция gmtime() преобразует значение time_t в struct tm, которое выражает данное время в UTC.

struct tm * localtime(const time_t *t)
localtime()
ведет себя подобно gmtime() за исключением того, что создается объект struct tm, выраженный в показателях местного времени. Местное время определяется для всей системы путем установки файлов часовых поясов. Его можно переопределить с помощью переменной окружения TZ для пользователей, работающих в часовом поясе, отличном от того, в котором находится компьютер.

time_t mktime(struct tm *tp);
mktime()
преобразует struct tm в time_t, предполагая, что struct tm выражается в показателях местного времени.

time_t timegm(struct tm *tp);
timegm()
ведет себя подобно mktime() за исключением предположения о том, что struct tm выражается в показателях UTC. Данная функция не является стандартной.

double difftime(time_t time1, time_t time0);
difftime()
возвращает число с плавающей запятой, представляющее разность во времени в секундах между двумя значениями time_t. Хотя time_t гарантированно принадлежит к арифметическому типу, единица измерения не определяется в ANSI/ISO С; difftime() возвращает разность в секундах в зависимости от единиц измерения time_t.

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

char *asctime(struct tm *tp);
char *ctime(time_t *t);
asctime()
и ctime() служат для преобразования временных значений в стандартную строку даты Unix, которая выглядит примерно так:

Tue Jun 17 23:17:29 1997

В обоих случаях длина сроки равна 26 символам и включает в себя завершающие символы новой строки и ''.

Не во всех локалях длина строки обязательно равна 26 символам, как в стандартной локали С.

ctime() выражает указанную дату в местном времени; asctime() — в том часовом поясе, который указан в struct tm. Если последний объект был создан с помощью gmtime(), то в показателях UTC, если при помощи localtime(), то по местному времени.

size_t strftime (char *s, size_t max, char *fmt, struct tm *tp);
strftime()
работает также как sprintf() для времени. Она форматирует struct tm в соответствии с форматом fmt и размещает результат в не более чем max байтах (включая завершающий символ '') строки s.

Подобно sprintf(), функция strftime() использует символ % для ввода управляющих последовательностей, в которые подставляются данные. Все подстановочные строки выражаются в показателях текущей локали. Однако сами управляющие последовательности являются совершенно разными. В некоторых случаях строчные буквы применяются для аббревиатур, а заглавные буквы — для полных имен. В отличие от sprintf(), здесь отсутствует опция употребления чисел в середине управляющей последовательности для ограничения длины подстановочной строки; выражение %.6А недопустимо. По аналогии с функцией sprintf(), strftime() возвращает количество символов, выведенных в буфер s. Равенство данной величины значению max означает, что объем буфера недостаточен для текущей локали; необходимо выделить больший буфер и попытаться снова.

strftime() использует те же самые подстановки, что и программа работы с датами. Ниже приводятся определения для подстановок в стандартной локали, они служат для того, чтобы помочь вам идентифицировать тип информации. В остальных локалях они могут отличаться.

Трехбуквенная аббревиатура для названия дня недели.
Полное название дня недели.
%b Трехбуквенная аббревиатура для названия месяца.
Полное название месяца.
Предпочтительное локальное выражение даты и времени (такое как возвращают функции ctime() и asctime()).
%d День месяца в числовом виде (отсчет ведется от нуля).
Час дня по 24-часовому времени (отсчет ведется от нуля).
%I Час дня по 12-часовому времени (отсчет ведется от нуля).
%j День года (отсчет ведется от единицы).
%m Месяц года (отсчет ведется от единицы).
Минута в часе (отсчет ведется от нуля).
%p Соответствующая строка для локального эквивалента выражений AM или PM.
%S Секунда в минуте (отсчет ведется от нуля).
%U Неделя года в числовом виде (первая неделя начинается с первого воскресенья года).
%W Неделя года в числовом виде (первая неделя начинается с первого понедельника года).
%w День недели в числовом виде (отсчет ведется с нуля).
%x Предпочтительное локальное выражение только для даты, без времени.
%X Предпочтительное локальное выражение только для времени, без даты.
%y Двухзначное представление года (без столетия). Не рекомендуется использовать такой формат — это потенциальный источник "проблемы 2000-го года".
%Y Полное четырехзначное числовое представление года.
%Z Название стандартной аббревиатуры часовой зоны.
%% Буквенный символ %.

char *strptime(char *s, char *fmt, struct tm *tp);

Как и scanf(), функция strptime() преобразует строку в разобранный формат. Она пытается быть либеральной при интерпретации введенной строки s в соответствии с форматирующей строкой fmt. Она принимает те же самые управляющие последовательности, что и strftime(), при этом для каждого типа ввода она допускает как аббревиатуры, так и полные имена. Она не различает символы верхнего и нижнего и регистра, а также не распознает %U и %W.

Функция strptime() предусматривает несколько дополнительных управляющих последовательностей; также она интерпретирует несколько последовательностей иначе (не так, как strftime()). В последующем списке перечислены только те управляющие последовательности, которые отличаются значительно (другими словами, выходят за рамки тех изменений, на которые мы уже указывали). Числа могут предваряться нулями, но это не обязательно.

%h Эквивалент %b и %B.
Считывает дату и время так, как печатает функция strftime() с форматирующей строкой %x %X.
Считывает дату и время так, как печатает функция strftime() с форматирующей строкой .
%e Эквивалент %d.
%D Считывает дату так, как печатает функция strftime() с форматирующей строкой %m/%d/%y.
%k Эквивалент .
%l Эквивалент %I.
%r Считывает время так, как печатает функция strftime() с форматирующей строкой %I:%М:%S %p.
%R Считывает время так, как печатает функция strftime() с форматирующей строкой %Н:%М.
%T Считывает время так, как печатает функция strftime() с форматирующей строкой %Н:%М:%S.
%y Считывает год в пределах двадцатого столетия. Допустимы значения только от 0 до 99, поскольку к ним добавляется число 1900.
%Y Считывает полный год. Применяйте, по возможности, этот формат вместо для того, чтобы избежать "проблемы 2000-го года".

Функция strptime() возвращает указатель на символ в s — символ, находящийся за последним прочитанным во время разбора.

Функция strptime(), к сожалению, не определена ни в ANSI/ISO, ни в POSIX, что ограничивает ее переносимость.

Оглавление книги


Генерация: 1.228. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз