Spec-Zone.ru › C++

std::time_get<CharT,InputIt>::get_time, std::time_get<CharT,InputIt>::do_get_time

Определён в заголовочном файле <locale>
public:
iter_type get_time( iter_type beg, iter_type end, std::ios_base& str,
                    std::ios_base::iostate& err, std::tm* t ) const;
(1)
protected:
virtual iter_type do_get_time( iter_type beg, iter_type end, std::ios_base& str,
                               std::ios_base::iostate& err, std::tm* t ) const;
(2)
1) Открытая функция-член вызывает защищённую виртуальную функцию-член do_get_time наиболее производного класса.
2) Считывает последовательные символы из последовательности [beg, end) и извлекает значение времени, следуя тем же правилам, что и спецификатор формата "%H:%M:%S", используемый функциями std::get_time, time_get::get и функцией POSIX strptime().
Разобранное время сохраняется в соответствующих полях структуры std::tm, на которую указывает аргумент t. Если итератор конца достигается до считывания корректного времени, функция устанавливает std::ios_base::eofbit в err. При возникновении ошибки разбора функция устанавливает std::ios_base::failbit в err.

Параметры

beg - итератор, указывающий на начало последовательности для разбора
end - итератор, следующий за последним элементом последовательности для разбора
str - объект потока, который эта функция использует для получения аспектов локали при необходимости, например std::ctype для пропуска пробельных символов
err - объект с флагами ошибок потока, который эта функция изменяет для указания на ошибки
t - указатель на объект std::tm, в котором будет храниться результат вызова этой функции

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

Итератор, указывающий на символ, следующий за последним символом в [beg, end), распознанным как часть корректной даты.

Примечания

Для буквенных компонентов формата времени по умолчанию (если они есть) эта функция обычно не учитывает регистр.

При возникновении ошибки разбора большинство реализаций этой функции не изменяют *t.

Пример

#include <iostream>
#include <iterator>
#include <locale>
#include <sstream>

void try_get_time(const std::string& s)
{
    std::cout << "Parsing the time out of '" << s
              << "' in the locale " << std::locale().name() << '\n';
    std::istringstream str(s);
    std::ios_base::iostate err = std::ios_base::goodbit;
    
    std::tm t;
    std::time_get<char> const& facet =
        std::use_facet<std::time_get<char>>(str.getloc());
    std::istreambuf_iterator<char> ret =
        facet.get_time({str}, {}, str, err, &t);
    str.setstate(err);
    
    if (str)
    {
        std::cout << "Hours: " << t.tm_hour << ", "
                     "Minutes: " << t.tm_min  << ", "
                     "Seconds: " << t.tm_sec  << '\n';
    }
    else
    {
        std::cout << "Parse failed. Unparsed string: ";
        std::copy(ret, {}, std::ostreambuf_iterator<char>(std::cout));
        std::cout << '\n';
    }
}

int main()
{
    std::locale::global(std::locale("ru_RU.utf8"));
    try_get_time("21:40:11");
    try_get_time("21-40-11");
    
    std::locale::global(std::locale("ja_JP.utf8"));
    try_get_time("21時37分58秒");
}

Вывод:

Parsing the time out of '21:40:11' in the locale ru_RU.utf8
Hours: 21, Minutes: 40, Seconds: 11
Parsing the time out of '21-40-11' in the locale ru_RU.utf8
Parse failed. Unparsed string: -40-11
Parsing the time out of '21時37分58秒' in the locale ja_JP.utf8
Hours: 21, Minutes: 37, Seconds: 58

Отчёты об ошибках

Следующие отчёты об ошибках, изменяющие поведение, были ретроактивно применены к ранее опубликованным стандартам C++.

DR Применяется к Опубликованное поведение Корректное поведение
LWG 248 C++98 eofbit не устанавливался при достижении итератора конца устанавливает eofbit, если корректное время не было считано
LWG 461 C++98 do_get_time требовался для разбора локализованного представления времени разбирает время в формате "%H:%M:%S"

См. также

get_time
(C++11)
разбирает значение даты/времени в указанном формате
(шаблон функции)

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

Spec-Zone.ru

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