Spec-Zone.ru › C++

std::get_time

Определено в заголовке <iomanip>
template< class CharT >
/*unspecified*/ get_time( std::tm* tmb, const CharT* fmt );
(с C++11)

При использовании в выражении in >> get_time(tmb, fmt), анализирует символьный ввод как значение даты/времени в соответствии с строкой формата fmt в соответствии с компонентой std::time_get текущего локализации ввода потоке in. Результирующее значение хранится в объекте std::tm, указанном на tmb.

Параметры

tmb - допустимый указатель на объект std::tm, где будет храниться результат
fmt - указатель на завершающую нулём строку CharT, определяющую формат преобразования

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

Возвращаемое значение

Объект неопределенного типа, такой что

  • если in является объектом типа std::basic_istream<CharT, Traits>, выражение in >> get_time(tmb, fmt)
    • имеет тип std::basic_istream<CharT, Traits>&
    • имеет значение in
    • ведет себя так, как если бы вызвало f(in, tmb, fmt)

где функция f определена как:

template<class CharT, class Traits>
void f(std::basic_ios<CharT, Traits>& str, std::tm* tmb, const CharT* fmt)
{
    using Iter = std::istreambuf_iterator<CharT, Traits>;
    using TimeGet = time_get<CharT, Iter>;
 
    std::ios_base::iostate err = std::ios_base::goodbit;
    const TimeGet& tg = std::use_facet<TimeGet>(str.getloc());
 
    tg.get(Iter(str.rdbuf()), Iter(), str, err, tmb,
        fmt, fmt + Traits::length(fmt));
 
    if (err != std::ios_base::goodbit)
        str.setstate(err);
}

Примечания

Как указано в std::time_get::do_get, что вызывает эта функция, не определено, обнуляет ли эта функция поля в *tmb, которые не заданы напрямую спецификаторами преобразования, которые появляются в fmt: портативные программы должны инициализировать каждое поле *tmb нулём перед вызовом std::get_time.

Пример

Примечание: выберите clang или gcc >= 12.1, чтобы увидеть вывод. libstdc++ до версии 12.1 не правильно реализует спецификатор %b: отчёт об ошибке #78714.

#include <iomanip>
#include <iostream>
#include <locale>
#include <sstream>
 
int main()
{
    std::tm t = {};
    std::istringstream ss("2011-Februar-18 23:12:34");
    ss.imbue(std::locale("de_DE.utf-8"));
    ss >> std::get_time(&t, "%Y-%b-%d %H:%M:%S");
 
    if (ss.fail())
        std::cout << "Parse failed\n";
    else
        std::cout << std::put_time(&t, "%c") << '\n';
}

Возможный вывод:

Sun Feb 18 23:12:34 2011

См. также

time_get
парсит значения времени/даты из входной последовательности символов в std::tm
(шаблон класса)
put_time
(C++11)
форматирует и выводит значение даты/времени в соответствии с указанным форматом
(шаблон функции)
parse
(C++20)
парсит объект chrono из потока
(шаблон функции)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/io/manip/get_time

Spec-Zone.ru

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