Namespaces
Variants

std::time_get<CharT,InputIt>:: get, std::time_get<CharT,InputIt>:: do_get

From cppreference.net
Определено в заголовке <locale>
public :

iter_type get ( iter_type beg, iter_type end, std:: ios_base & str,
std:: ios_base :: iostate & err, std:: tm * t,

const char_type * fmtbeg, const char_type * fmtend ) const ;
(1) (начиная с C++11)
protected :

virtual iter_type do_get ( iter_type beg, iter_type end, std:: ios_base & str,
std:: ios_base :: iostate & err, std:: tm * t,

char format, char modifier ) const ;
(2) (начиная с C++11)
1) Анализирует дату и время из входной символьной последовательности [ beg, end ) в соответствии с форматом, предоставленным в символьной последовательности [ fmtbeg, fmtend ) . Ожидается, что формат соответствует описанию ниже, хотя фактическая обработка каждого спецификатора формата может быть настроена путем переопределения do_get . Функция get выполняет следующие действия: Сначала очищает биты ошибок в err выполняя err = std:: ios_base :: goodbit . Затем входит в цикл, который завершается при выполнении любого из следующих условий (проверяемых в указанном порядке):
а) Все символы были прочитаны из строки формата ( fmtbeg == fmtend ).
b) Произошла ошибка парсинга ( err ! = std:: ios_base :: goodbit ).
c) Все символы были прочитаны из входной последовательности ( beg == end ). Если цикл завершается по этому условию, функция устанавливает как eofbit , так и failbit в err .
В теле цикла выполняются следующие шаги:
а) Если следующий символ в строке формата - '%' , за которым следует один или два символа, образующих допустимый std::get_time спецификатор преобразования (см. ниже), эти символы используются при вызове do_get ( beg, end, str, err, t, format, modifier ) , где format - основной символ спецификатора преобразования, а modifier - опциональный модификатор (который появляется между % и символом формата, если присутствует). Если модификатор отсутствует, используется значение ' \0 ' . Если строка формата неоднозначна или слишком коротка для определения спецификатора преобразования после '%' , eofbit устанавливается в err и цикл прерывается. Если после вызова do_get в err не установлены биты ошибок, функция инкрементирует fmtbeg для указания на позицию сразу после спецификатора преобразования и продолжает цикл.
b) Если следующий символ является пробельным, как указано в локали, предоставленной в потоке str (т.е. std:: isspace ( * fmtbeg, str. getloc ( ) ) == true ), функция продолжает инкрементировать fmtbeg до тех пор, пока он либо станет равным fmtend , либо будет указывать на непробельный символ.
c) Если следующий символ в строке формата эквивалентен следующему символу во входном потоке согласно сравнению без учета регистра, функция продвигает обе последовательности на один символ ++ fmtbeg, ++ beg ; и продолжает цикл. В противном случае, она устанавливает failbit в err .
2) Разбирает один спецификатор преобразования из входной последовательности [ beg, end ) и обновляет структуру std::tm , на которую указывает t , соответствующим образом.
Сначала очищает биты ошибок в err выполняя err = std:: ios_base :: goodbit . Затем читает символы из входной последовательности [ beg, end ) соответствующие спецификатору формата std::time_get сформированному комбинацией '%' , modifier (если не ' \0 ' ) и format . Если символы не образуют допустимый спецификатор преобразования, устанавливает failbit в err . Если конец входного потока достигается после чтения символа, устанавливает eofbit в err . Если входная строка успешно разобрана, обновляет соответствующие поля * t .
Для сложных спецификаторов преобразования, таких как '%x' или '%c' , или директив, использующих модификаторы 'E' и 'O' , функция может не определить некоторые значения для сохранения в * t . В таком случае она устанавливает eofbit в err и оставляет эти поля в неопределенном состоянии.

Содержание

Параметры

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)
парсирует значение даты/времени указанного формата
(шаблон функции)