Аргумент 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 *
Возвращает при успешном завершении указатель на статически размещенную строку или 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 или NULL при ошибке
Функция strptime() использует спецификацию, заданную в аргументе format, для разбора строки в формате «дата плюс время», указанной в аргументе str. Затем она помещает результат преобразования в разделенное календарное время в структуру, на которую указывает аргумент timeptr.