Аргумент format, используемый при вызове strftime(), представляет собой строку по типу той, что задается в функции printf(). Последовательности, начинающиеся с символа процента (%), являются спецификаторами преобразования, которые заменяются различными компонентами даты и времени в соответствии с символом, следующим за символом процента. Предусмотрен довольно обширный выбор спецификаторов преобразования, часть компонентов которого перечислена в табл. 10.1. (Полный перечень можно найти на странице руководства strftime(3).) За исключением особо оговариваемых, все эти спецификаторы преобразования стандартизированы в SUSv3.

Спецификаторы %U и %W выводят номер недели в году. Номера недель, выводимые с помощью %U, исчисляются из расчета, что первая неделя, начиная с воскресенья, получает номер 1, а предшествующая ей неполная неделя получает номер 0. Если воскресенье приходится на первый день года, то неделя с номером 0 отсутствует и последний день года приходится на неделю под номером 53. Нумерация недель, выводимых с помощью %W, работает точно так же, но вместо воскресенья в расчет берется понедельник.

Зачастую в книге нам придется выводить текущее время в различных демонстрационных программах. Для этого мы предоставляем функцию currTime(), которая возвращает строку с текущим временем, отформатированным функцией strftime() при заданном аргументе format.

#include "curr_time.h"

char *currTime(const char *format);

Возвращает при успешном завершении указатель на статически размещенную строку или NULL при ошибке

Реализация функции currTime() показана в листинге 10.2.

Таблица 10.1. Отдельные спецификаторы преобразования для strftime()

Спецификатор — Описание — Пример

%% — Символ % — %

%a — Сокращенное название дня недели — Tue

%A — Полное название дня недели — Tuesday

%b, %h — Сокращенное название месяца — Feb

%B — Полное название месяца — February

%c — Дата и время — Tue Feb 1 21:39:46 2011

%d — День месяца (две цифры, от 01 до 31) — 01

%D — Дата в американском формате (то же самое, что и %m/%d/%y) — 02/01/11

%e — День месяца (два символа) — _1

%F — Дата в формате ISO (то же самое, что и %Y-%m-%d) — 2011-02-01

%H — Час (24-часовой формат, две цифры) — 21

%I — Час (12-часовой формат, две цифры) — 09

%j — День года (три цифры, от 001 до 366) — 032

%m — Месяц в виде десятичного числа (две цифры, от 01 до 12) — 02

%M — Минута (две цифры) — 39

%p — AM/PM (до полудня/после полудня) — PM

%P — am/pm (GNU-расширение) — pm

%R — Время в 24-часовом формате (то же самое, что и %H:%M) — 21:39

%S — Секунда (от 00 до 60) — 46

%T — Время (то же самое, что и %H:%M:%S) — 21:39:46

%u — Номер дня недели (от 1 до 7, Понедельник = 1) — 2

%U — Номер недели, начинающейся с воскресенья (от 00 до 53) — 05

%w — Номер дня недели (от 0 до 6, воскресенье = 0) — 2

%W — Номер недели, начинающейся с понедельника (от 00 до 53) — 05

%x — Дата (локализированная версия) — 02/01/11

%X — Время (локализированная версия) — 21:39:46

%y — Последние две цифры года — 11

%Y — Год в формате четырех цифр — 2011

%Z — Название часового пояса — CET

Листинг 10.2. Функция, возвращающая строку с текущим временем

time/curr_time.c

#include

#include "curr_time.h" /* Объявление определяемых здесь функций */

#define BUF_SIZE 1000

/* Возвращает строку, содержащую текущее время, отформатированное в сооответствии

со спецификацией в 'format' (спецификаторы на странице руководства strftime(3)).

Если 'format' имеет значение NULL, в качестве спецификатора мы используем "%c"

(что дает дату и время, как для ctime(3), но без завершающего символа новой строки).

При ошибке возвращается NULL. */

char *

currTime(const char *format)

{

static char buf[BUF_SIZE]; /* Нереентерабельная */

time_t t;

size_t s;

struct tm *tm;

t = time(NULL);

tm = localtime(&t);

if (tm == NULL)

return NULL;

s = strftime(buf, BUF_SIZE, (format!= NULL)? format: "%c", tm);

return (s == 0)? NULL: buf;

}

time/curr_time.c

Преобразование из печатного вида в разделенное календарное время

Функция strptime() выполняет преобразование, обратное тому, которое делает функция strftime(). Она преобразует строку в виде даты и времени в разделенное календарное время (время, разбитое на компоненты).

#define _XOPEN_SOURCE

#include

char *strptime(const char *str, const char *format, struct tm *timeptr);

Возвращает при успешном завершении указатель на следующий необработанный символ в str или NULL при ошибке

Функция strptime() использует спецификацию, заданную в аргументе format, для разбора строки в формате «дата плюс время», указанной в аргументе str. Затем она помещает результат преобразования в разделенное календарное время в структуру, на которую указывает аргумент timeptr.

Перейти на страницу:

Похожие книги