Namespaces
Variants

std::chrono:: parse

From ru.cppreference.net
Определено в заголовке <chrono>
template < class CharT, class Parsable >
/* неопределённый */ parse ( const CharT * fmt, Parsable & tp ) ;
(1) (начиная с C++20)
template < class CharT, class Traits, class Alloc, class Parsable >

/* неопределено */ parse ( const std:: basic_string < CharT, Traits, Alloc > & fmt,

Parsable & tp ) ;
(2) (начиная с C++20)
template < class CharT, class Traits, class Alloc, class Parsable >

/* неопределённый */ 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 >

/* неопределённый */ 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 >

/* неопределённый */ parse ( const CharT * fmt, Parsable & tp,

std:: chrono :: minutes & offset ) ;
(5) (начиная с C++20)
template < class CharT, class Traits, class Alloc, class Parsable >

/* неопределённый */ 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 >

/* неопределённый */ 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 >

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

1) from_stream ( is, fmt, tp )
2) from_stream ( is, fmt. c_str ( ) , tp )
3) from_stream ( is, fmt, tp, std:: addressof ( abbrev ) )
4) from_stream ( is, fmt. c_str ( ) , tp, std:: addressof ( abbrev ) )
5) from_stream ( is, fmt, tp,
static_cast < std:: basic_string < CharT, Traits, Alloc > * > ( nullptr ) , & offset )
6) from_stream ( is, fmt. c_str ( ) , tp,
static_cast < std:: basic_string < CharT, Traits, Alloc > * > ( nullptr ) , & offset )
7) from_stream ( is, fmt, tp, std:: addressof ( abbrev ) , & offset )
8) 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
% N C
%EC
Парсит век как десятичное число. Ширина N определяет максимальное количество символов для чтения. Ширина по умолчанию равна 2. Ведущие нули разрешены, но не обязательны.

Модифицированная команда %EC интерпретирует альтернативное представление века в локали.

%y
% N y
%Ey
%Oy
Анализирует последние две десятичные цифры года. Если век не указан иным образом (например, с помощью %C), значения в диапазоне [69, 99] считаются относящимися к годам с 1969 по 1999, а значения в диапазоне [00, 68] считаются относящимися к годам с 2000 по 2068. Ширина N определяет максимальное количество символов для чтения. Ширина по умолчанию равна 2. Ведущие нули разрешены, но не обязательны.

Модифицированные команды %Ey и %Oy интерпретируют альтернативное представление локали.

%Y
% N Y
%EY
Разбирает год как десятичное число. Ширина N определяет максимальное количество считываемых символов. Ширина по умолчанию равна 4. Ведущие нули разрешены, но не обязательны.

Модифицированная команда %EY интерпретирует альтернативное представление локали.

Месяц
%b
%B
%h
Разбирает полное или сокращённое название месяца в локали без учёта регистра.
%m
% N m
%Om
Преобразует месяц в десятичное число (январь - это 1 ). Ширина N определяет максимальное количество символов для чтения. Ширина по умолчанию равна 2. Ведущие нули разрешены, но не обязательны.

Модифицированная команда %Om интерпретирует альтернативное представление локали.

День
%d
% N d
%Od
%e
% N e
%Oe
Преобразует день месяца в десятичное число. Ширина N определяет максимальное количество символов для чтения. Ширина по умолчанию равна 2. Ведущие нули разрешены, но не обязательны.

Модифицированные команды %Od и %Oe интерпретируют альтернативное представление локали.

День недели
%a
%A
Выполняет разбор полного или сокращенного названия дня недели в локали без учета регистра.
%u
% N u
Преобразует номер дня недели по ISO в десятичное число (1-7), где понедельник соответствует 1 . Ширина N задает максимальное количество считываемых символов. Ширина по умолчанию равна 1. Ведущие нули допускаются, но не обязательны.
%w
% N w
%Ow
Преобразует день недели в десятичное число (0-6), где воскресенье равно 0 . Ширина N определяет максимальное количество считываемых символов. Ширина по умолчанию равна 1. Ведущие нули допускаются, но не обязательны.

Модифицированная команда %Ow интерпретирует альтернативное представление локали.

ISO 8601 недельный год

В стандарте ISO 8601 недели начинаются с понедельника, и первая неделя года должна удовлетворять следующим требованиям:

  • Включает 4 января
  • Включает первый четверг года
%g
% N g
Анализирует последние две десятичные цифры года по стандарту ISO 8601 на основе недель. Ширина N определяет максимальное количество символов для чтения. Ширина по умолчанию составляет 2. Ведущие нули разрешены, но не обязательны.
%G
% N G
Анализирует год на основе недель по стандарту ISO 8601 как десятичное число. Ширина N определяет максимальное количество символов для чтения. Ширина по умолчанию составляет 4. Ведущие нули разрешены, но не обязательны.
%V
% N V
Анализирует неделю года по стандарту ISO 8601 как десятичное число. Ширина N определяет максимальное количество символов для чтения. Ширина по умолчанию составляет 2. Ведущие нули разрешены, но не обязательны.
Неделя/день года
%j
% N j
Преобразует день года в виде десятичного числа (1 января соответствует 1 ). Ширина N определяет максимальное количество считываемых символов. Ширина по умолчанию составляет 3. Ведущие нули допускаются, но не обязательны.
%U
% N U
%OU
Парсит номер недели года как десятичное число. Первое воскресенье года является первым днем недели 01. Дни того же года до этого относятся к неделе 00. Ширина N определяет максимальное количество символов для чтения. Ширина по умолчанию равна 2. Ведущие нули разрешены, но не обязательны.

Модифицированная команда %OU интерпретирует альтернативное представление локали.

%W
% N W
%OW
Преобразует номер недели года в десятичное число. Первый понедельник года является первым днем недели 01. Дни того же года, предшествующие этому, относятся к неделе 00. Ширина N определяет максимальное количество символов для чтения. Ширина по умолчанию равна 2. Ведущие нули разрешены, но не обязательны.

Модифицированная команда %OW интерпретирует альтернативное представление локали.

Дата
%D Эквивалентно "%m/%d/%y" .
%F
% N F
Эквивалентно "%Y-%m-%d" . Если указана ширина, она применяется только к %Y .
%x
%Ex
Анализирует представление даты в локали.

Модифицированная команда %Ex интерпретирует альтернативное представление даты в локали.

Время суток
%H
% N H
%OH
Анализирует час (24-часовой формат) как десятичное число. Ширина N определяет максимальное количество символов для чтения. Ширина по умолчанию составляет 2. Ведущие нули разрешены, но не обязательны.

Модифицированная команда %OH интерпретирует альтернативное представление локали.

%I
% N I
%OI
Анализирует час (12-часовой формат) как десятичное число. Ширина N определяет максимальное количество символов для чтения. Ширина по умолчанию равна 2. Ведущие нули разрешены, но не обязательны.

Модифицированная команда %OI интерпретирует альтернативное представление локали.

%M
% N M
%OM
Разбирает минуты как десятичное число. Ширина N определяет максимальное количество символов для чтения. Ширина по умолчанию равна 2. Ведущие нули разрешены, но не обязательны.

Модифицированная команда %OM интерпретирует альтернативное представление локали.

%S
% N S
%OS
Парсит секунды как десятичное число. Ширина N определяет максимальное количество символов для чтения. Ширина по умолчанию составляет 2. Ведущие нули разрешены, но не обязательны.

Модифицированная команда %OS интерпретирует альтернативное представление локали.

%p Анализирует локальные эквиваленты обозначений AM/PM, связанных с 12-часовым форматом времени.
%R Эквивалентно "%H:%M" .
%T Эквивалентно "%H:%M:%S" .
%r Анализирует 12-часовой формат времени в локали.
%X
%EX
Анализирует представление времени в локали.

Модифицированная команда %EX интерпретирует альтернативное представление времени в локали.

Разное
%c
%Ec
Анализирует представление даты и времени локали.

Модифицированная команда %Ec интерпретирует альтернативное представление даты и времени локали.

%z
%Ez
%Oz
Анализирует смещение от UTC в формате [+|-]hh[mm] . Например, -0430 означает 4 часа 30 минут позади UTC, а 04 означает 4 часа впереди UTC.

Модифицированные команды %Ez и %Oz анализируют формат [+|-]h[h][:mm] (т.е. требуют двоеточие : между часами и минутами и делают ведущий ноль для часов опциональным).

%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++.

DR Applied to Behavior as published Correct behavior
LWG 3554 C++20 перегрузки для простых нуль-терминированных последовательностей символьных типов отсутствовали добавлены

Смотрите также

парсит sys_time из потока в соответствии с предоставленным форматом
(шаблон функции)
парсит utc_time из потока в соответствии с предоставленным форматом
(шаблон функции)
парсит tai_time из потока в соответствии с предоставленным форматом
(шаблон функции)
парсит gps_time из потока в соответствии с предоставленным форматом
(шаблон функции)
парсит file_time из потока в соответствии с предоставленным форматом
(шаблон функции)
парсит local_time из потока в соответствии с предоставленным форматом
(шаблон функции)
парсит year из потока в соответствии с предоставленным форматом
(шаблон функции)
парсит month из потока в соответствии с предоставленным форматом
(шаблон функции)
парсит day из потока в соответствии с предоставленным форматом
(шаблон функции)
парсит weekday из потока в соответствии с предоставленным форматом
(шаблон функции)
парсит month_day из потока в соответствии с предоставленным форматом
(шаблон функции)
парсит year_month из потока в соответствии с предоставленным форматом
(шаблон функции)
парсит year_month_day из потока в соответствии с предоставленным форматом
(шаблон функции)
(C++11)
парсит значение даты/времени указанного формата
(шаблон функции)