Для лучшего управления точным форматированием времени и даты ОС Linux и современные UNIX-подобные системы предоставляют функцию strftime
. Она довольно похожа на функцию sprintf
для дат и времени и действует аналогичным образом:
#include
size_t strftime(char *s, size_t maxsize, const char *format, struct tm *timeptr);
Функция strftime
форматирует время и дату, представленные в структуре tm
, на которую указывает параметр, timeptr
, и помещает результат в строку s
. Эта строка задается длиной maxsize
(как минимум) символов. Строка format
применяется для управления символами, записываемыми в строку. Как и в функции printf
, она содержит обычные символы, которые будут переданы в строку, и спецификаторы преобразований для форматирования элементов времени и даты. В табл. 4.3 перечислены используемые спецификаторы преобразований.
Спецификатор преобразования | Описание |
---|---|
%a | Сокращенное название дня недели |
%А | Полное название дня недели |
%b | Сокращенное название месяца |
%B | Полное название месяца |
%c | Дата и время |
%d | День месяца, 01–31 |
%H | Час, 00–23 |
%I | Час по 12-часовой шкале, 01–12 |
%j | День в году, 001–366 |
%m | Номер месяца в году, 01–12 |
%M | Минуты, 00–59 |
%p | a.m. (до полудня) или p.m. (после полудня) |
%S | Секунды, 00–59 |
%u | Номер дня недели, 1–7 (1 соответствует понедельнику) |
%U | Номер недели в году, 01–53 (воскресенье — первый день недели) |
%V | Номер недели в году, 01–53 (понедельник — первый день недели) |
%w | Номер дня недели, 0–6 (0 соответствует воскресенью) |
%x | Дата в региональном формате |
%X | Время в региональном формате |
%y | Номер года, меньший 1900 |
%Y | Год |
%Z | Название часового пояса |
%% | Символ % |
Таким образом, обычная дата, такая же, как полученная из программы date, соответствует следующей строке формата функции strftime
:
"%a %b %d %Н: %М: %S %Y"
Для облегчения чтения дат можно использовать функцию strptime
, принимающую строку с датой и временем и формирующую структуру tm
с теми же датой и временем:
#include
char *strptime(const char *buf, const char *format, struct tm *timeptr);
Строка format
конструируется точно так же, как одноименная строка функции strftime
. Функций strptime
действует аналогично функции sscanf
: она сканирует строку в поиске опознаваемых полей и записывает их в переменные. В данном случае это элементы структуры tm
, которая заполняется в соответствии со строкой format
. Однако спецификаторы преобразований для strptime
немного мягче спецификаторов функции strftime
. Так, в функции strptime
разрешены как сокращенные, так и полные названия дней и месяцев. Любое из этих представлений будет соответствовать спецификатору %a функции strptime
. Кроме того, в то время как функция strftime
для представления чисел, меньших 10, всегда применяет ведущие нули, strptime
считает их необязательными.
Функция strptime
возвращает указатель на символ, следующий за последним, обработанным в процессе преобразования. Если она встречает символы, которые не могут быть преобразованы, в этой точке преобразование просто прекращается. Для того чтобы убедиться в том, что в структуру tm
записаны значимые данные, вызывающей программе следует проверять, достаточно ли символов строки принято и обработано.
Рассмотрим работу функций на примере (упражнение 4.9).
strftime
и strptime
Обратите внимание на выбор спецификаторов преобразований, использованных в следующей программе:
#include
#include
#include
int main {
struct tm *tm_ptr, timestruct;
time_t the_time;
char buf[256];
char *result;
(void)time(&the_time);
tm_ptr = localtime(&the_time);
strftime(buf, 256, "%A %d %B, %I:%S %p", tm_ptr);
printf("strftime gives: %s\n", buf);
strcpy(buf, "Thu 26 July 2007, 17:53 will do fine");
printf("calling strptime with: %s\n", buf);