Программирование ARM strptime(): преобразование строки в дату/время Sat, May 18 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

strptime(): преобразование строки в дату/время Печать
Добавил(а) microsin   

Функция strptime() преобразует строку символов, на которую указывает параметр buf, в значения, сохраняемые в структуру tm, на которую указывает параметр tm, с использованием формата, указанного в параметре format:

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

Примечание: поведение этой функции может зависеть от категорий LC_CTYPE, LC_TIME и LC_TOD текущей локали. Эта функция недоступна, когда в команде компиляции указано LOCALETYPE(*CLD). Для дополнительной информации см. [2].

Параметр format содержит текст из одной или большего количества директив. Директива содержит либо обычный символ (не % и не пробел), либо спецификацию преобразования. Каждая спецификация преобразования составлена из символа %, за которым идет один или большее количество символов преобразования, которые указывают требуемую замену. Если спецификаторов формата несколько, то между ними должен присутствовать пробел или другой разделитель. Это относится и к buf, и к format, для гарантии, что функция будет вести себя ожидаемо. Здесь должен быть разделитель между двумя преобразованиями строка -> число, или первое число конверсии может преобразовать символы, которые относятся ко второму спецификатору конверсии.

Любой пробел (whitespace, как указано isspace()), который встретился перед сканированной директивой либо в строке format, либо во входной строке, будет игнорироваться. Директива, являющаяся обычным символом, должна точно соответствовать следующему сканированному символу во входной строке. Регистр релевантен при совпадении с обычными директивами символов. Если обычная символьная директива в строке формата не соответствует символу во входной строке, strptime потерпит неудачу, и больше ни один символ не будет отсканирован.

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

Пропущенные поля в структуре tm могу быть заполнены в вызове strftime, если предоставлено достаточно информации. Например, если предоставлена дата, то может быть вычислено поле tm_yday.

Каждая стандартная спецификация преобразования заменяется подходящими символами, как описано в следующей таблице:

Таблица 1. Спецификаторы формата strptime().

%a Имя дня недели, может быть либо полным именем, либо его аббревиатурой.
%A То же самое, что %a.
%b Имя месяца, может быть либо полным именем, либо его аббревиатурой.
%B То же самое, что %b.
%c Дата/время в формате локали.
%C Значение века [00–99]. Вычисляет год, если для его указания даны 2 цифры.
%d День месяца [1–31].
%D Формат даты, то же самое, что %m/%d/%y.
%e То же самое, что и %d.
%g 2 цифры порции года ISO week date [00–99].
%G 4 цифры порции года ISO week date. Может быть отрицательным.
%h То же самое, что и %b.
%H Значение часа в 24-часовом формате [0–23].
%I Значение часа в 12-часовом формате [1-12].
%j День года [1-366].
%m Месяц [1-12].
%M Минута [0-59].
%n Пропуск всех пробелов, пока не будет найден символ перевода строки.
%p Строка AM или PM, используется для вычисления значения часа, когда используется 12-часовой формат.
%r Время в формате AM/PM локали. Если недоступно в формате локального времени, то по умолчанию применяется формат времени POSIX AM/PM: %I:%M:%S %p.
%R 24-часовой формат времени без секунд, например %H:%M.
%S Секунды [00-61]. Диапазон секунд позволяет учитывать добавочную секунду (leap second) и двойную добавочную секунду (double leap second).
%t Пропустить все пробелы до появления символа табуляции.
%T 24-часовой формат времени с секундами, то же самое что %H:%M:%S.
%u День недели [1–7]. 1 это понедельник (Monday), 7 воскресенье (Sunday).
%U Номер недели года [0-53], Sunday соответствует первому дню недели. Используется в вычислении дня года.
%V ISO-номер недели года [1-53]. Monday соответствует первому дню недели. Если неделя, содержащая 1 января, содержит в себе 4 или больше дней в новом году, то она считается неделей 1. Иначе она будет последней неделей предыдущего года, и следующая неделя будет неделей 1 нового года. Используется в вычислении дня года.
%w День недели [0-6]. Sunday соответствует 0.
%W Номер недели года [0-53]. Monday соответствует первому дню недели. Используется в вычислении дня года.
%x Дата в формате локали.
%X Время в формате локали.
%y Год из двух цифр [0-99].
%Y Год из 4 цифр. Может быть отрицательным.
%z Смещение UTC. Выводит строку с форматом +HHMM или -HHMM, где + означает запад от GMT, - означает восток от GMT, HH означает количество часов от GMT, и MM означает количество минут от GMT.
%Z Имя временной зоны.
%% Символ процента (%).

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

Таблица 2. Модифицированные спецификаторы преобразования strptime().

%Ec Дата/время текущей эры.
%EC Имя эры.
%Ex Дата текущей эры.
%EX Время текущей эры.
%Ey Год эры. Это смещение от года базы.
%EY Год текущей эры.
%Od День месяца с использованием альтернативных цифр.
%Oe То же самое что и %Od.
%OH Час в 24-часовом формате, с использованием альтернативных цифр.
%OI Час в 12-часовом формате, с использованием альтернативных цифр.
%Om Месяц с использованием альтернативных цифр.
%OM Минуты с использованием альтернативных цифр.
%OS Секунды с использованием альтернативных цифр.
%Ou День недели с использованием альтернативных цифр. Monday это 1, и Sunday это 7.
%OU День недели с использованием альтернативных цифр. Sunday это первый день недели.
%OV ISO-номер недели года, с использованием альтернативных цифр. См. %V для объяснения ISO week number.
%Ow День недели, использующих альтернативную цифру. Sunday это 0, и Saturday 6.
%OW Номер недели года с использованием альтернативных цифр. Monday это первый день недели.
%Oy Год в 2 цифрах с использованием альтернативных цифр.
%OZ Имя временной зоны в виде аббревиатуры.

Возвращаемое значение. По успешному завершению функция strptime() возвратит указатель на символ, следующий за последним обработанным символом. Иначе будет возвращен null-указатель. Значение errno может быть установлено в ECONVERT (conversion error, ошибка преобразования).

Пример использования strptime():

#include < stdio.h>
#include < locale.h>
#include < time.h>
 
int main(void)
{
   char buf[100];
   time_t t;
   struct tm *timeptr,result;
 
   setlocale(LC_ALL,"/QSYS.LIB/EN_US.LOCALE");
   t = time(NULL);
   timeptr = localtime(&t);
   strftime(buf,sizeof(buf), "%a %m/%d/%Y %r", timeptr);
 
   if(strptime(buf, "%a %m/%d/%Y %r",&result) == NULL)
      printf("\nstrptime failed\n");
   else
   {
      printf("tm_hour:  %d\n",result.tm_hour);
      printf("tm_min:  %d\n",result.tm_min);
      printf("tm_sec:  %d\n",result.tm_sec);
      printf("tm_mon:  %d\n",result.tm_mon);
      printf("tm_mday:  %d\n",result.tm_mday);
      printf("tm_year:  %d\n",result.tm_year);
      printf("tm_yday:  %d\n",result.tm_yday);
      printf("tm_wday:  %d\n",result.tm_wday);
   }
 
   return 0;
}
 
/************************************************************
   Вывод должен быть примерно таким:
   Tue 10/30/2001 10:59:10 AM
   tm_hour:  10
   tm_min:  59
   tm_sec:  10
   tm_mon:  9
   tm_mday:  30
   tm_year:  101
   tm_yday:  302
   tm_wday:  2
************************************************************/

Другие функции с подобным функционалом:

asctime() Преобразует время в строку символов.

asctime_r() Преобразует время в строку символов (Restartable).

ctime() Преобразует время в строку символов.

ctime64() Преобразует время в строку символов.

ctime64_r() Преобразует время в строку символов (Restartable).

ctime_r() Преобразует время в строку символов (Restartable).

gmtime() Преобразует время.

gmtime64() Преобразует время.

gmtime64_r() Преобразует время (Restartable).

gmtime_r() Преобразует время (Restartable).

localtime() Преобразует время.

localtime64() Преобразует время.

localtime64_r() Преобразует время (Restartable).

localtime_r() Преобразует время (Restartable).

setlocale() Установит локаль.

strftime() Преобразует дату/время в строку.

time() Определит текущее время.

time64() Определит текущее время.

wcsptime() Преобразует Wide Character String в дату/время.

[Ссылки]

1. strptime() Convert String to Date/Time site:ibm.com.
2. Understanding CCSIDs and Locales site:ibm.com

 

Добавить комментарий


Защитный код
Обновить

Top of Page