std::chrono::parse
Определён в заголовочном файле <chrono> | ||
|---|---|---|
template< class CharT, class Parsable > /* unspecified */ parse( const CharT* fmt, Parsable& tp ); | (1) | (начиная с C++20) |
template< class CharT, class Traits, class Alloc, class Parsable >
/* unspecified */ parse( const std::basic_string<CharT, Traits, Alloc>& fmt,
Parsable& tp );
| (2) | (начиная с C++20) |
template< class CharT, class Traits, class Alloc, class Parsable >
/* unspecified */ parse( const CharT* fmt, Parsable& tp,
std::basic_string<CharT, Traits, Alloc>& abbrev );
| (3) | (начиная с C++20) |
template< class CharT, class Traits, class Alloc, class Parsable >
/* unspecified */ parse( const std::basic_string<CharT, Traits, Alloc>& fmt,
Parsable& tp,
std::basic_string<CharT, Traits, Alloc>& abbrev );
| (4) | (начиная с C++20) |
template< class CharT, class Parsable >
/* unspecified */ parse( const CharT* fmt, Parsable& tp,
std::chrono::minutes& offset );
| (5) | (начиная с C++20) |
template< class CharT, class Traits, class Alloc, class Parsable >
/* unspecified */ parse( const std::basic_string<CharT, Traits, Alloc>& fmt,
Parsable& tp, std::chrono::minutes& offset );
| (6) | (начиная с C++20) |
template< class CharT, class Traits, class Alloc, class Parsable >
/* unspecified */ parse( const CharT* fmt, Parsable& tp,
std::basic_string<CharT, Traits, Alloc>& abbrev,
std::chrono::minutes& offset );
| (7) | (начиная с C++20) |
template< class CharT, class Traits, class Alloc, class Parsable >
/* unspecified */ parse( const std::basic_string<CharT, Traits, Alloc>& fmt,
Parsable& tp,
std::basic_string<CharT, Traits, Alloc>& abbrev,
std::chrono::minutes& offset );
| (8) | (начиная с C++20) |
Возвращает объект manip неуказанного типа, такой что для объекта std::basic_istream<CharT, Traits> is выражение is >> manip вызывает from_stream (без квалификатора, чтобы обеспечить поиск, зависящий от аргументов) следующим образом:
from_stream(is, fmt, tp)
from_stream(is, fmt.c_str(), tp)
from_stream(is, fmt, tp, std::addressof(abbrev))
from_stream(is, fmt.c_str(), tp, std::addressof(abbrev))
from_stream(is, fmt, tp, static_cast<std::basic_string<CharT, Traits, Alloc>*>(nullptr), &offset)
from_stream(is, fmt.c_str(), tp, static_cast<std::basic_string<CharT, Traits, Alloc>*>(nullptr), &offset)
from_stream(is, fmt, tp, std::addressof(abbrev), &offset)
from_stream(is, fmt.c_str(), tp, std::addressof(abbrev), &offset).Выражение is >> manip является lvalue типа std::basic_istream<CharT, Traits> со значением is.
Эти перегрузки участвуют в разрешении перегрузки, только если соответствующее выражение from_stream является корректным.
Рекомендуется, чтобы реализации затрудняли использование потенциально висячих ссылок на строку формата, например, делая возвращаемые типы неперемещаемыми и запрещая operator>> принимать lvalue возвращаемых типов.
Параметры
| fmt | - | строка формата (см. ниже) |
| tp | - | объект для хранения результата разбора |
| abbrev | - | строка для хранения аббревиатуры или названия часового пояса, соответствующего спецификатору %Z |
| offset | - | длительность, представляющая смещение относительно UTC, соответствующее спецификатору %z |
Строка формата
Строка формата состоит из нуля или более спецификаторов преобразования и обычных символов. Каждый обычный символ, за исключением пробельных символов и завершающего нулевого символа, соответствует такому же символу во входном потоке или приводит к сбою функции, если следующий символ в потоке не совпадает с ним.
Каждый пробельный символ соответствует нулю или более пробельным символам во входном потоке.
Каждый немодифицированный спецификатор преобразования начинается с символа %, за которым следует символ, определяющий поведение спецификатора. Некоторые спецификаторы преобразования имеют модифицированную форму, в которой после символа % вставляется символ-модификатор E или O. Некоторые спецификаторы преобразования имеют модифицированную форму, в которой после символа % вставляется параметр ширины, заданный положительным десятичным целым числом (ниже обозначенным как N). Каждый спецификатор преобразования приводит к интерпретации сопоставленных символов как частей типов даты и времени согласно приведённой ниже таблице.
Последовательность символов в строке формата, начинающаяся с %, но не соответствующая ни одному из приведённых ниже спецификаторов преобразования, интерпретируется как обычные символы.
Если from_stream не удаётся разобрать всё, что задано строкой формата, если разобранной информации недостаточно для задания полного результата или если разбор обнаруживает противоречивую информацию, вызывается is.setstate(std::ios_base::failbit).
Доступны следующие спецификаторы преобразования:
| Спецификатор преобразования | Описание | |
|---|---|---|
%% | Соответствует буквальному символу %. |
|
%n | Соответствует одному пробельному символу. | |
%t | Соответствует нулю или одному пробельному символу. | |
| Год | ||
%C %NC %EC | Разбирает век как десятичное число. Ширина N задаёт максимальное число считываемых символов. Ширина по умолчанию равна 2. Ведущие нули разрешены, но не обязательны. Модифицированная команда |
|
%y %Ny %Ey %Oy | Разбирает последние две десятичные цифры года. Если век не задан иным способом (например, с помощью %C), считается, что значения в диапазоне [69, 99] относятся к годам с 1969 по 1999, а значения в диапазоне [00, 68] — к годам с 2000 по 2068. Ширина N задаёт максимальное число считываемых символов. Ширина по умолчанию равна 2. Ведущие нули разрешены, но не обязательны. Модифицированные команды |
|
%Y %NY %EY | Разбирает год как десятичное число. Ширина N задаёт максимальное число считываемых символов. Ширина по умолчанию равна 4. Ведущие нули разрешены, но не обязательны. Модифицированная команда |
|
| Месяц | ||
%b%B%h | Разбирает полное или сокращённое название месяца из локали без учёта регистра. | |
%m%Nm%Om | Разбирает месяц как десятичное число (январь — 1). Ширина N задаёт максимальное число считываемых символов. Ширина по умолчанию равна 2. Ведущие нули разрешены, но не обязательны. Модифицированная команда |
|
| День | ||
%d%Nd%Od%e%Ne%Oe | Разбирает день месяца как десятичное число. Ширина N задаёт максимальное число считываемых символов. Ширина по умолчанию равна 2. Ведущие нули разрешены, но не обязательны. Модифицированные команды |
|
| День недели | ||
%a%A | Разбирает полное или сокращённое название дня недели из локали без учёта регистра. | |
%u%Nu | Разбирает день недели по ISO как десятичное число (1–7), где понедельник — 1. Ширина N задаёт максимальное число считываемых символов. Ширина по умолчанию равна 1. Ведущие нули разрешены, но не обязательны. |
|
%w%Nw%Ow | Разбирает день недели как десятичное число (0–6), где воскресенье — 0. Ширина N задаёт максимальное число считываемых символов. Ширина по умолчанию равна 1. Ведущие нули разрешены, но не обязательны. Модифицированная команда |
|
| Год и неделя по ISO 8601 | ||
| Согласно ISO 8601 неделя начинается в понедельник, а первая неделя года должна удовлетворять следующим требованиям:
|
||
%g%Ng | Разбирает последние две десятичные цифры года и недели по ISO 8601. Ширина N задаёт максимальное число считываемых символов. Ширина по умолчанию равна 2. Ведущие нули разрешены, но не обязательны. | |
%G%NG | Разбирает год и неделю по ISO 8601 как десятичное число. Ширина N задаёт максимальное число считываемых символов. Ширина по умолчанию равна 4. Ведущие нули разрешены, но не обязательны. | |
%V%NV | Разбирает номер недели года по ISO 8601 как десятичное число. Ширина N задаёт максимальное число считываемых символов. Ширина по умолчанию равна 2. Ведущие нули разрешены, но не обязательны. | |
| Неделя/день года | ||
%j%Nj | Разбирает день года как десятичное число (1 января — 1). Ширина N задаёт максимальное число считываемых символов. Ширина по умолчанию равна 3. Ведущие нули разрешены, но не обязательны. |
|
%U%NU%OU | Разбирает номер недели года как десятичное число. Первое воскресенье года является первым днём недели 01. Дни того же года, предшествующие ему, относятся к неделе 00. Ширина N задаёт максимальное число считываемых символов. Ширина по умолчанию равна 2. Ведущие нули разрешены, но не обязательны. Модифицированная команда |
|
%W%NW%OW | Разбирает номер недели года как десятичное число. Первый понедельник года является первым днём недели 01. Дни того же года, предшествующие ему, относятся к неделе 00. Ширина N задаёт максимальное число считываемых символов. Ширина по умолчанию равна 2. Ведущие нули разрешены, но не обязательны. Модифицированная команда |
|
| Дата | ||
%D | Эквивалентен "%m/%d/%y". |
|
%F%NF | Эквивалентен "%Y-%m-%d". Если ширина задана, она применяется только к %Y. |
|
%x%Ex | Разбирает представление даты из локали. Модифицированная команда |
|
| Время суток | ||
%H%NH%OH | Разбирает час (в 24-часовом формате) как десятичное число. Ширина N задаёт максимальное число считываемых символов. Ширина по умолчанию равна 2. Ведущие нули разрешены, но не обязательны. Модифицированная команда |
|
%I%NI%OI | Разбирает час (в 12-часовом формате) как десятичное число. Ширина N задаёт максимальное число считываемых символов. Ширина по умолчанию равна 2. Ведущие нули разрешены, но не обязательны. Модифицированная команда |
|
%M%NM%OM | Разбирает минуты как десятичное число. Ширина N задаёт максимальное число считываемых символов. Ширина по умолчанию равна 2. Ведущие нули разрешены, но не обязательны. Модифицированная команда |
|
%S%NS%OS | Разбирает секунды как десятичное число. Ширина N задаёт максимальное число считываемых символов. Ширина по умолчанию равна 2. Ведущие нули разрешены, но не обязательны. Модифицированная команда |
|
%p | Разбирает соответствующие локали обозначения AM/PM для 12-часового формата. | |
%R | Эквивалентен "%H:%M". |
|
%T | Эквивалентен "%H:%M:%S". |
|
%r | Разбирает время в 12-часовом формате, используемое в локали. | |
%X%EX | Разбирает представление времени из локали. Модифицированная команда |
|
| Прочее | ||
%c%Ec | Разбирает представление даты и времени из локали. Модифицированная команда |
|
%z%Ez%Oz | Разбирает смещение относительно UTC в формате [+|-]hh[mm]. Например, -0430 означает, что время отстаёт от UTC на 4 часа 30 минут, а 04 — что оно опережает UTC на 4 часа. Модифицированные команды |
|
%Z | Разбирает аббревиатуру или название часового пояса как самую длинную последовательность символов, содержащую только символы A–Z, a–z, 0–9, -, +, _ и /. |
|
Пример
#include <chrono>
#include <iostream>
#include <locale>
#include <sstream>
int main()
{
auto parse = [&](auto str, auto fmt, auto o)
{
std::istringstream is{str};
is.imbue(std::locale("en_US.utf-8"));
is >> std::chrono::parse(fmt, o);
is.fail() ? std::cout << "Parse failed!\n" : std::cout << o << '\n';
};
parse("01:02:03", "%H:%M:%S", std::chrono::hours{});
parse("01:02:03", "%H:%M:%S", std::chrono::minutes{});
parse("01:02:03", "%H:%M:%S", std::chrono::seconds{});
}
Возможный вывод:
1h 62min 3723s
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были ретроактивно применены к ранее опубликованным стандартам C++.
| Отчёт об ошибке | Применён к | Поведение согласно опубликованной версии | Корректное поведение |
|---|---|---|---|
| LWG 3554 | C++20 | отсутствовали перегрузки для последовательностей символов без завершающего нуля | добавлены |
См. также
|
(C++20) | разбирает sys_time из потока в соответствии с заданным форматом (шаблон функции) |
|
(C++20) | разбирает utc_time из потока в соответствии с заданным форматом (шаблон функции) |
|
(C++20) | разбирает tai_time из потока в соответствии с заданным форматом (шаблон функции) |
|
(C++20) | разбирает gps_time из потока в соответствии с заданным форматом (шаблон функции) |
|
(C++20) | разбирает file_time из потока в соответствии с заданным форматом (шаблон функции) |
|
(C++20) | разбирает local_time из потока в соответствии с заданным форматом (шаблон функции) |
|
(C++20) | разбирает year из потока в соответствии с заданным форматом (шаблон функции) |
|
(C++20) | разбирает month из потока в соответствии с заданным форматом (шаблон функции) |
|
(C++20) | разбирает day из потока в соответствии с заданным форматом (шаблон функции) |
|
(C++20) | разбирает weekday из потока в соответствии с заданным форматом (шаблон функции) |
|
(C++20) | разбирает month_day из потока в соответствии с заданным форматом (шаблон функции) |
|
(C++20) | разбирает year_month из потока в соответствии с заданным форматом (шаблон функции) |
|
(C++20) | разбирает year_month_day из потока в соответствии с заданным форматом (шаблон функции) |
|
(C++11) | разбирает дату/время в заданном формате (шаблон функции) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/chrono/parse