std::time_get<CharT,InputIt>:: get, std::time_get<CharT,InputIt>:: do_get
|
Определено в заголовке
<locale>
|
||
|
public
:
iter_type get
(
iter_type beg, iter_type end,
std::
ios_base
&
str,
|
(1) | (начиная с C++11) |
|
protected
:
virtual
iter_type do_get
(
iter_type beg, iter_type end,
std::
ios_base
&
str,
|
(2) | (начиная с C++11) |
do_get
. Функция
get
выполняет следующие действия:
Сначала очищает биты ошибок в
err
выполняя
err
=
std::
ios_base
::
goodbit
. Затем входит в цикл, который завершается при выполнении любого из следующих условий (проверяемых в указанном порядке):
eofbit
, так и
failbit
в
err
.
-
- В теле цикла выполняются следующие шаги:
%
и символом формата, если присутствует). Если модификатор отсутствует, используется значение
'
\0
'
. Если строка формата неоднозначна или слишком коротка для определения спецификатора преобразования после
'%'
,
eofbit
устанавливается в
err
и цикл прерывается. Если после вызова
do_get
в
err
не установлены биты ошибок, функция инкрементирует
fmtbeg
для указания на позицию сразу после спецификатора преобразования и продолжает цикл.
failbit
в
err
.
-
-
Сначала очищает биты ошибок в
err
выполняя
err
=
std::
ios_base
::
goodbit
. Затем читает символы из входной последовательности
[
beg, end
)
соответствующие спецификатору формата
std::time_get
сформированному комбинацией
'%'
,
modifier
(если не
'
\0
'
) и
format
. Если символы не образуют допустимый спецификатор преобразования, устанавливает
failbitв err . Если конец входного потока достигается после чтения символа, устанавливаетeofbitв err . Если входная строка успешно разобрана, обновляет соответствующие поля * t .
-
Сначала очищает биты ошибок в
err
выполняя
err
=
std::
ios_base
::
goodbit
. Затем читает символы из входной последовательности
[
beg, end
)
соответствующие спецификатору формата
std::time_get
сформированному комбинацией
'%'
,
modifier
(если не
'
\0
'
) и
format
. Если символы не образуют допустимый спецификатор преобразования, устанавливает
-
-
Для сложных спецификаторов преобразования, таких как
'%x'
или
'%c'
, или директив, использующих модификаторы
'E'
и
'O'
, функция может не определить некоторые значения для сохранения в
*
t
. В таком случае она устанавливает
eofbitв err и оставляет эти поля в неопределенном состоянии.
-
Для сложных спецификаторов преобразования, таких как
'%x'
или
'%c'
, или директив, использующих модификаторы
'E'
и
'O'
, функция может не определить некоторые значения для сохранения в
*
t
. В таком случае она устанавливает
Содержание |
Параметры
| beg | - | итератор, указывающий на начало последовательности для разбора |
| end | - | итератор, указывающий на позицию за последним элементом последовательности для разбора |
| str | - | объект потока, который эта функция использует для получения локалей при необходимости, например std::ctype для пропуска пробельных символов или std::collate для сравнения строк |
| err | - | объект флагов ошибок потока, который модифицируется этой функцией для индикации ошибок |
| t | - | указатель на объект std::tm , который будет содержать результат вызова этой функции |
| fmtbeg | - |
указатель на первый символ последовательности символов
char_type
, задающей формат преобразования (см. ниже)
|
| fmtend | - |
указатель на позицию за последним символом последовательности символов
char_type
, задающей формат преобразования
|
| format | - | символ, обозначающий спецификатор преобразования |
| modifier | - |
опциональный модификатор, который может появляться между
%
и спецификатором преобразования
|
Строка формата состоит из нуля или более спецификаторов преобразования, пробельных символов и обычных символов (за исключением
%
). Каждый обычный символ должен соответствовать одному символу во входном потоке при сравнении без учета регистра. Каждый пробельный символ соответствует произвольному пробелу во входной строке. Каждая спецификация преобразования начинается с символа
%
, за которым может следовать модификатор
E
или
O
(игнорируется, если не поддерживается локалью), после которого следует символ, определяющий поведение спецификатора. Спецификаторы формата соответствуют функции POSIX
strptime()
:
|
Спецификатор
преобразования |
Объяснение | Записывает в поля |
|---|---|---|
%
|
соответствует символу
%
. Полная спецификация преобразования должна быть
%%
|
(нет) |
t
|
соответствует любому пробельному символу | (none) |
n
|
соответствует любому пробельному символу | (none) |
| Год | ||
Y
|
парсит полный год как 4-значное десятичное число, ведущие нули разрешены, но не обязательны |
tm_year
|
EY
|
парсит год в альтернативном представлении, например 平成23年 (год Хэйсэй 23), который записывает 2011 в tm_year в локали ja_JP |
tm_year
|
y
|
парсит последние 2 цифры
year
как десятичное число. Диапазон
[69,99]
даёт значения 1969-1999, диапазон
[00,68]
даёт 2000-2068
|
tm_year
|
Oy
|
разбирает последние 2 цифры года с использованием альтернативной числовой системы, например 十一 разбирается как 11 в локали ja_JP |
tm_year
|
Ey
|
парсит
year
как смещение от периода альтернативного календаря локали
%EC
|
tm_year
|
C
|
парсит первые 2 цифры
года
как десятичное число (диапазон
[00,99]
)
|
tm_year
|
EC
|
парсит название базового года (периода) в альтернативном представлении локали, например, 平成 (эра Хэйсэй) в ja_JP |
tm_year
|
| Месяц | ||
b
|
разбирает название месяца, полное или сокращенное, например
Oct
|
tm_mon
|
h
|
синоним
b
|
tm_mon
|
B
|
синоним
b
|
tm_mon
|
m
|
парсит
месяц
как десятичное число (диапазон
[01,12]
), ведущие нули разрешены, но не обязательны
|
tm_mon
|
Om
|
парсит месяц с использованием альтернативной числовой системы, например 十二 парсится как 12 в локали ja_JP |
tm_mon
|
| Неделя | ||
U
|
парсит
неделю года
как десятичное число (воскресенье является первым днем недели) (диапазон
[00,53]
), ведущие нули разрешены, но не обязательны
|
tm_year
,
tm_wday
,
tm_yday
|
OU
|
парсит
неделю года
, как в
%U
, используя альтернативную числовую систему, например 五十二 парсится как 52 в локали ja_JP
|
tm_year
,
tm_wday
,
tm_yday
|
W
|
парсит
неделю года
как десятичное число (понедельник является первым днём недели) (диапазон
[00,53]
), ведущие нули разрешены, но не обязательны
|
tm_year
,
tm_wday
,
tm_yday
|
OW
|
парсит
неделю года
, как в
%W
, используя альтернативную числовую систему, например 五十二 парсится как 52 в локали ja_JP
|
tm_year
,
tm_wday
,
tm_yday
|
| День года/месяца | ||
j
|
парсит
день года
как десятичное число (диапазон
[001,366]
), ведущие нули разрешены, но не обязательны
|
tm_yday
|
d
|
преобразует
день месяца
в виде десятичного числа (диапазон
[01,31]
), ведущие нули допускаются, но не обязательны
|
tm_mday
|
Od
|
анализирует день месяца с использованием альтернативной числовой системы, например, 二十七 анализируется как 27 в локали ja_JP, ведущие нули допускаются, но не обязательны |
tm_mday
|
e
|
синоним
d
|
tm_mday
|
Oe
|
синоним
Od
|
tm_mday
|
| День недели | ||
a
|
анализирует название дня недели, полное или сокращенное, например
Fri
|
tm_wday
|
A
|
синоним
a
|
tm_wday
|
w
|
парсит
день недели
как десятичное число, где воскресенье равно
0
(диапазон
[0-6]
)
|
tm_wday
|
Ow
|
парсит
день недели
как десятичное число, где воскресенье равно
0
, используя альтернативную числовую систему, например 二 парсится как 2 в локали ja_JP
|
tm_wday
|
| Час, минута, секунда | ||
H
|
парсит
час
как десятичное число, 24-часовой формат (диапазон
[00-23]
), ведущие нули допускаются, но не обязательны
|
tm_hour
|
OH
|
парсит час из 24-часового формата с использованием альтернативной числовой системы, например 十八 парсится как 18 в локали ja_JP |
tm_hour
|
I
|
преобразует
hour
как десятичное число, 12-часовой формат (диапазон
[01,12]
), ведущие нули допускаются, но не обязательны
|
tm_hour
|
OI
|
парсит час из 12-часового формата с использованием альтернативной числовой системы, например 六 читается как 06 в локали ja_JP |
tm_hour
|
M
|
парсит
минуту
как десятичное число (диапазон
[00,59]
), ведущие нули допускаются, но не обязательны
|
tm_min
|
OM
|
парсит минуты с использованием альтернативной числовой системы, например 二十五 парсится как 25 в локали ja_JP |
tm_min
|
S
|
парсит
секунды
как десятичное число (диапазон
[00,60]
), ведущие нули допускаются, но не обязательны
|
tm_sec
|
OS
|
парсит секунды используя альтернативную числовую систему, например 二十四 парсится как 24 в локали ja_JP |
tm_sec
|
| Прочее | ||
c
|
обрабатывает стандартный строковый формат даты и времени локали, например
Sun Oct 17 04:41:13 2010
(зависит от локали)
|
все |
Ec
|
анализирует альтернативный формат строки даты и времени локали, например, ожидает 平成23年 (год Хэйсэй 23) вместо 2011年 (год 2011) в локали ja_JP | все |
x
|
анализирует стандартное представление даты в локали | все |
Ex
|
анализирует альтернативное представление даты в локали, например, ожидает 平成23年 (год Хэйсэй 23) вместо 2011年 (год 2011) в локали ja_JP | все |
X
|
анализирует стандартное представление времени локали | все |
EX
|
анализирует альтернативное представление времени локали | все |
D
|
эквивалентно "%m / %d / %y " |
tm_mon
,
tm_mday
,
tm_year
|
r
|
анализирует стандартное 12-часовое время локали (в POSIX, "%I : %M : %S %p" ) |
tm_hour
,
tm_min
,
tm_sec
|
R
|
эквивалентно "%H : %M" |
tm_hour
,
tm_min
|
T
|
эквивалентно "%H : %M : %S" |
tm_hour
,
tm_min
,
tm_sec
|
p
|
анализирует локальный эквивалент a.m. или p.m. |
tm_hour
|
Примечание:
tm_isdst
не записывается и должно быть установлено явно для использования с функциями такими как
mktime
Возвращаемое значение
Итератор, указывающий на позицию за последним символом в [ beg, end ) , который был успешно распарсен.
Примечания
Без учета регистра сравнение для не-пробельных не- '%' символов в строке формата, обычно, но не обязательно, используется фасет std::collate локали, предоставленной str .
Если возникает ошибка синтаксического анализа, многие реализации этой функции оставляют * t полностью нетронутым.
Не определено, обнуляют ли эти функции поля в
*
t
, которые они не устанавливают напрямую: переносимые программы должны инициализировать каждое поле нулём перед вызовом
get()
.
Пример
#include <iomanip> #include <iostream> #include <locale> #include <sstream> int main() { std::istringstream ss("2026-März-12 23:45:56"); ss.imbue(std::locale("de_DE.utf8")); auto& f = std::use_facet<std::time_get<char>>(ss.getloc()); std::tm t{}; std::string s = "%Y-%b-%d %H:%M:%S"; std::ios_base::iostate err = std::ios_base::goodbit; auto ret = f.get({ss}, {}, ss, err, &t, &s[0], &s[0] + s.size()); ss.setstate(err); std::istreambuf_iterator<char> last{}; if (ss) { std::cout << "Successfully parsed as " << std::put_time(&t, "%c") << '\n'; if (ret != last) { std::cout << "Remaining content: "; std::copy(ret, last, std::ostreambuf_iterator<char>(std::cout)); } else std::cout << "The input was fully consumed."; } else { std::cout << "Parse failed.\nUnparsed string: "; std::copy(ret, last, std::ostreambuf_iterator<char>(std::cout)); } std::cout << '\n'; }
Вывод:
Successfully parsed as Sun Mar 12 23:45:56 2026 The input was fully consumed.
Смотрите также
|
(C++11)
|
парсирует значение даты/времени указанного формата
(шаблон функции) |