Преобразовать строку во время
#include <time.h>char * strptime( const char *buf,const char *format,struct tm *timeptr );
libc
Функция strptime() преобразует символьную строку buf во время и сохраняет его в структуре struct tm, на которую указывает timeptr, используя определенный формат.
Форматы
Поле формата format состоит из нуля или большего числа директив. Каждая директива может состоять из одного из следующих символов:
Необходимо, что между любыми двумя спецификаторами имелись пробелы или другие не буквенно-цифровые символы. |
Функция strptime() поддерживает следующие спецификаторы:
%a
или %A
%b
, %B
или %h
%c
%C
[00, 99]
. Разрешены необязательные начальные нули. %d
или %e
[01, 31]
. Разрешены необязательные начальные нули. %D
%m/%d/%y
. %H
[00, 23]
. Разрешены необязательные начальные нули. %I
[01, 12]
. Разрешены необязательные начальные нули. %j
[001, 366]
. Разрешены необязательные начальные нули. %m
[01, 12]
. Разрешены необязательные начальные нули. %M
[00, 59]
. Разрешены необязательные начальные нули. %n
или %t
%p
%r
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
включительно. Разрешены необязательные начальные нули. Столетие по умолчанию, полученное из двухзначного года, может измениться в будущих версиях стандарта IEEE Std 1003.1-2001. Это замечание справедливо для всех команд, принимающих двухзначный год в своих входных данных. |
%Y
1988
). %%
%
. Модифицированные_спецификаторы
Некоторые спецификаторы можно изменить путем добавления символа модификатора E
и O
для указания, что необходимо использовать альтернативный формат или спецификацию вместо того, который используется при неизмененных спецификаторах. Если альтернативный формат или спецификация не существуют в текущей локали, функция ведет себя так, как если использовался неизмененный спецификатор.
%Ec
%EC
%Ex
%EX
%Ey
%EC
(только за год) в альтернативном региональном представлении. %EY
%Od
или %Oe
%OH
%OI
%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 системной библиотеки