strptime()

Преобразовать строку во время

Прототип:

#include <time.h>
char * strptime( const char *buf,
const char *format,
struct tm *timeptr );

Аргументы:

buf
Указатель на буфер, содержащий строку для преобразования.
format
Используемый формат времени, см. "Форматы".
timeptr
Указатель на структуру struct tm, в которую будет записано время.

Библиотека:

libc

Описание:

Функция strptime() преобразует символьную строку buf во время и сохраняет его в структуре struct tm, на которую указывает timeptr, используя определенный формат.

Форматы

Поле формата format состоит из нуля или большего числа директив. Каждая директива может состоять из одного из следующих символов:


Note: Необходимо, что между любыми двумя спецификаторами имелись пробелы или другие не буквенно-цифровые символы.

Функция strptime() поддерживает следующие спецификаторы:

%a or %A
День недели в соответствии с региональными названиями дней недели. Используется либо сокращенное, либо полное имя.
%b, %B, or %h
Месяц в соответствии с региональными названиями месяцев. Используется либо сокращенное, либо полное имя.
%c
Заменяется региональным представлением даты и времени.
%C
Век [00, 99]. Разрешены необязательные начальные нули.
%d or %e
День месяца [01, 31]. Разрешены необязательные начальные нули.
%D
Дата в виде %m/%d/%y.
%H
Час (24-часовые часы) [00, 23]. Разрешены необязательные начальные нули.
%I
Час (12-часовые часы) [01, 12]. Разрешены необязательные начальные нули.
%j
День в году [001, 366]. Разрешены необязательные начальные нули.
%m
Номер месяца [01, 12]. Разрешены необязательные начальные нули.
%M
Минута [00, 59]. Разрешены необязательные начальные нули.
%n or %t
Любые пробелы.
%p
Региональный эквивалент a.m. или p.m.
%r
12-часовое время с использованием записи AM/PM, если поле t_fmt_ampm не пустая строка в переменной LC_TIME текущей локали. Для POSIX локали это будет эквивалентно %I:%M:%S %p.
%R
Время в виде %H:%M.
%S
Секунды [00, 60]. Разрешены необязательные начальные нули.
%T
Время в виде %H:%M:%S.
%U
Номер недели года (воскресенье - первый день недели) в виде десятичного числа [00, 53]. Разрешены необязательные начальные нули.
%w
День недели в виде десятичного числа [0, 6], где 0 обозначает воскресенье. Разрешены необязательные начальные нули.
%W
Номер недели года (понедельник - первый день недели) в виде десятичного числа [00, 53]. Разрешены необязательные начальные нули.
%x
Дата с использованием регионального формата даты.
%X
Время с использованием регионального формата времени.
%y
Год в столетии. Если столетие не указано иначе, то значения в диапазоне [69, 99] соответствуют годам с 1969 по 1999 включительно, а значения в диапазоне [00, 68] соответствуют годам с 2000 to 2068 включительно. Разрешены необязательные начальные нули.

Note: Столетие по умолчанию, полученное из двухзначного года, может измениться в будущих версиях стандарта IEEE Std 1003.1-2001. Это замечание справедливо для всех команд, принимающих двухзначный год в своих входных данных.

%Y
Год, включая столетие (например, 1988).
%%
Заменяется на %.

Модифицированные_спецификаторы

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

%Ec
Альтернативное региональное представление соответствующих даты и времени.
%EC
Название базового года (периода) в альтернативном региональном представлении.
%Ex
Альтернативное региональное представление даты.
%EX
Альтернативное региональное представление времени.
%Ey
Смещение от %EC (только за год) в альтернативном региональном представлении.
%EY
Полное представление альтернативного года.
%Od или %Oe
День месяца с использованием альтернативных региональных цифровых символов. Разрешены необязательные начальные нули. but not required.
%OH
Час (24-часовые часы) с использованием альтернативных региональных цифровых символов.
%OI
Час (12-часовые часы) с использованием альтернативных региональных цифровых символов.
%Om
Месяц с использованием альтернативных региональных цифровых символов.
%OM
Минуты с использованием альтернативных региональных цифровых символов.
%OS
Секунды с использованием альтернативных региональных цифровых символов.
%OU
Неделя в году (воскресенье - первый день недели) с использованием региональных цифровых символов.
%Ow
День в неделе (воскресенье = 0) с использованием региональных цифровых символов.
%OW
Неделя в году (понедельник - первый день недели) с использованием региональных цифровых символов.
%Oy
Год (смещение от %C) с использованием региональных цифровых символов.

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

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

Серия спецификаторов, состоящая из %n, %t, пробелов, или любой комбинации символов вычисляется путем поиска до первого непробельного символа, или пока не перестанут сканироваться символы.

Любой другой спецификатор вычисляется путем поиска символов до тех пор, пока не будет найден символ, соответствующий следующей директиве, или пока не будет найдено больше символов. Эти символы, за исключением одного, соответствующего следующей директиве, затем сравниваются с региональными значениями, в соответствии со спецификатором. Если соответствие найдено, то нужные поля структуры struct tm устанавливаются в значения, соответствующие информации о локали. Регистр игнорируется при сопоставлении элементов в buf, таких как названия месяцев или дней недели. Если совпадение не найдено, то функ strptime() завершается с ошибкой и больше не сканирует символы.

Возвращаемое значение:

Указатель на символ, следующий за последним проанализированным в строке, или NULL.

Примеры:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
int main( void )
{
struct tm my_tm;
char in_buffer[ 80 ] ="July 31, 1993 11:00:00",
out_buffer[ 80 ];
time_t t;
/* Convert the string to a struct tm. */
memset( &my_tm, 0, sizeof( struct tm ) );
strptime( in_buffer, "%b %d, %Y %T", &my_tm );
/* Convert the struct tm to a time_t (to fill in the missing fields). */
t = mktime( &my_tm );
/* Convert the time back to a string. */
strftime( out_buffer, 80, "That's %D (a %A), at %T", localtime( &t ) );
printf( "%s\n", out_buffer );
return (EXIT_SUCCESS);
}

Код генерирует следующий вывод:

$ ./a.out That's 07/31/93 (a Saturday), at 11:00:00

Классификация:

ANSI, POSIX 1003.1

Точка остановки потока
Нет
Обработчик прерываний
Нет
Обработчик сигналов
Да
В потоке
Да

Тематические ссылки:

scanf(), strftime(), struct tm, time(), tzset()




Предыдущий раздел: Описание API системной библиотеки