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 разбирает полный год как десятичное число из 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';
}

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

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/cpp/io/manip/get_time

Spec-Zone.ru

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