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,
               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. Затем функция вступает в цикл, который завершается всякий раз, когда выполняется любое из следующих условий (проверяемых в указанном порядке):
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'. Если строка формата неоднозначна или заканчивается слишком рано, чтобы определить спецификатор преобразования после '%', устанавливается 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, задающих формат преобразования

Строка формата состоит из нуля или более спецификаторов преобразования, пробелов и обычных символов (кроме %). Каждый обычный символ должен соответствовать одному символу в потоке входных данных при сравнении без учёта регистра. Каждый пробел соответствует произвольному пробелу во входной строке. Каждая спецификация преобразования начинается с символа %, необязательно с E или O модификатором (игнорируется, если не поддерживается локалью), за которым следует символ, определяющий поведение спецификатора. Спецификаторы формата соответствуют функции POSIX strptime():

Спецификатор
преобразования
Описание Записывается в поля
% соответствует литеральному %. Полная спецификация преобразования должна быть %% (нет)
t соответствует любому пробелу (нет)
n соответствует любому пробелу (нет)
Год
Y разбирает год как четырёхзначное десятичное число, ведущие нули разрешены, но не обязательны tm_year
EY разбирает год в альтернативной записи, например, 平成23年 (год Хэйсэй 23), что записывает 2011 в tm_year в локали ja_JP 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 разбирает альтернативный формат даты и времени локали, например, ожидая 平成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

fmtend - указатель на элемент, следующий за последним символом последовательности символов char_type, задающих формат преобразования
format - символ, обозначающий спецификатор преобразования
modifier - необязательный модификатор, который может находиться между % и спецификатором преобразования

Return value

Итератор, указывающий на символ, следующий за последним успешно разобранным символом в [beg, end).

Notes

Для сравнения регистронезависимых не-пробельных не-'%' символов в строке формата, std::collate-аспект локали, предоставляемой str, обычно, но не обязательно, используется.

В случае ошибки разбора многие реализации этой функции оставляют *t полностью нетронутым.

Не определено, обнуляются ли поля в *t, которые они не устанавливают напрямую: программы, совместимые со стандартом, должны инициализировать каждое поле нулем перед вызовом get().

Example

#include <iomanip>
#include <iostream>
#include <locale>
#include <sstream>
 
int main()
{
    std::istringstream ss("2011-Februar-18 23:12:34");
    ss.imbue(std::locale("de_DE.utf8"));
 
    auto& f = std::use_facet<std::time_get<char>>(std::locale("de_DE.utf8"));
    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");
        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. Unparsed string: ";
        std::copy(ret, last, std::ostreambuf_iterator<char>(std::cout));
    }
    std::cout << '\n';
}

Вывод:

Successfully parsed, as Sun Feb 18 23:12:34 2011 The input was fully consumed

See also

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

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

Spec-Zone.ru

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