При использовании в выражении 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
разбирает полный год как десятичное число из 4 цифр; начальные нули допускаются, но не обязательны
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
разбирает альтернативный формат даты и времени локали; например, в локали 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, это поле необходимо задать явно
Возвращаемое значение
Объект неуказанного типа, такой что
если 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';
}