Spec-Zone.ru › C++

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,
               std::ios_base::iostate& err, std::tm* t,
               char format, char modifier = 0 ) const;
(1) (начиная с C++11)
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;
(2) (начиная с 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;
(3) (начиная с C++11)
1) Открытая функция-член, вызывает защищённую виртуальную функцию-член do_get наиболее производного класса.
2) Разбирает дату и время из входной последовательности символов [beg, end) в соответствии с форматом, заданным последовательностью символов [fmtbeg, fmtend). Предполагается, что формат соответствует описанному ниже, хотя обработку каждого спецификатора формата можно настроить, переопределив do_get. Функция get выполняет следующие действия: сначала сбрасывает биты ошибок в err, выполняя err = std::ios_base::goodbit. Затем запускается цикл, который завершается при выполнении любого из следующих условий (проверяемых в указанном порядке):
a) Все символы строки формата прочитаны (fmtbeg == fmtend).
b) Произошла ошибка разбора (err != std::ios_base::goodbit).
c) Все символы входной последовательности прочитаны (beg == end). Если цикл завершается по этому условию, функция устанавливает оба флага eofbit и failbit в err.
В теле цикла выполняются следующие действия:
a) Если следующий символ строки формата — '%', за которым следует один или два символа, образующих допустимый спецификатор преобразования std::get_time (см. ниже), эти символы используются при вызове do_get(beg, end, str, err, t, format, modifier), где format — символ основного спецификатора преобразования, а modifier — необязательный модификатор (если он присутствует, он находится между % и символом формата). Если модификатора нет, используется значение '\0'. Если строка формата неоднозначна или заканчивается слишком рано, чтобы определить спецификатор преобразования после '%', в err устанавливается eofbit, и цикл завершается. Если после вызова do_get в err не установлены биты ошибок, функция увеличивает fmtbeg, чтобы он указывал на символ сразу после спецификатора преобразования, и продолжает цикл.
b) Если следующий символ является пробельным согласно локали потока str (то есть std::isspace(*fmtbeg, str.getloc()) == true), функция продолжает увеличивать fmtbeg, пока он не станет равен fmtend или не укажет на непробельный символ.
c) Если следующий символ строки формата эквивалентен следующему символу входного потока при сравнении без учёта регистра, функция продвигает обе последовательности на один символ ++fmtbeg, ++beg; и продолжает цикл. В противном случае она устанавливает failbit в err.
3) Разбирает один спецификатор преобразования из входной последовательности [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 соответствует любому пробельному символу (нет)
n соответствует любому пробельному символу (нет)
Год
Y разбирает полный год как десятичное число из 4 цифр; начальные нули допустимы, но не обязательны tm_year
EY разбирает год в альтернативном представлении, например 平成23年 (23-й год эпохи Хэйсэй), который в локали ja_JP записывает 2011 в tm_year tm_year
y разбирает последние 2 цифры года как десятичное число. Диапазону [69,99] соответствуют значения от 1969 до 1999, диапазону [00,68] — значения от 2000 до 2068 tm_year
Oy разбирает последние 2 цифры года в альтернативной системе счисления, например 十一 разбирается как 11 в локали ja_JP tm_year
Ey разбирает год как смещение от альтернативного календарного периода локали %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 разбирает час как десятичное число в 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 разбирает строку даты и времени в альтернативном формате локали; например, в локали ja_JP ожидается 平成23年 (23-й год эпохи Хэйсэй) вместо 2011年 (2011 год) все
x разбирает дату в стандартном представлении локали все
Ex разбирает дату в альтернативном представлении локали; например, в локали ja_JP ожидается 平成23年 (23-й год эпохи Хэйсэй) вместо 2011年 (2011 год) все
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.

См. также

get_time
(C++11)
разбирает значение даты/времени в указанном формате
(шаблон функции)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/locale/time_get/get

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API