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().
Модифицированные спецификаторы преобразования. Некоторые спецификаторы преобразования могут быть модифицированы символами E или O, чтобы показать необходимость использования альтернативную спецификацию формата. Если модифицированный спецификатор преобразования использует поле в текущем языковом стандарте, которое недоступно, то поведение будет таким, как если бы использовалась неизмененная спецификация преобразования. Например, если строка эры является пустой строкой "", то это означает, что эра недоступна, тогда %EY будет действовать как %Y. Таблица 2. Модифицированные спецификаторы преобразования strptime().
Возвращаемое значение. По успешному завершению функция 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. |