Spec-Zone.ru › C++

std::time_get<CharT,InputIt>::get_date, std::time_get<CharT,InputIt>::do_get_date

Определён в заголовочном файле <locale>
public:
iter_type get_date( 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_date( iter_type beg, iter_type end, std::ios_base& str,
                               std::ios_base::iostate& err, std::tm* t ) const;
(2)
1) Открытая функция-член, вызывает защищённую виртуальную функцию-член do_get_date наиболее производного класса.
2) Считывает последовательные символы из последовательности [beg, end) и анализирует значение календарной даты, используя формат по умолчанию, ожидаемый для данной локали, который определяется следующим образом:
date_order() Формат
no_order "%m/%d/%y"
dmy "%d/%m/%y"
mdy "%m/%d/%y"
ymd "%y/%m/%d"
ydm "%y/%d/%m"
как используется функциями std::get_time(), get() и функцией POSIX strptime().
Распознанная дата сохраняется в соответствующих полях структуры std::tm, на которую указывает аргумент t.
Если до считывания корректной даты достигнут конечный итератор, функция устанавливает std::ios_base::eofbit в err. При обнаружении ошибки разбора функция устанавливает std::ios_base::failbit в err.

Параметры

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

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

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

Примечания

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

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

Реализация может поддерживать и другие форматы дат, помимо требуемых стандартом.

Пример

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

void try_get_date(const std::string& s)
{
    std::cout << "Parsing the date 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;
    const std::time_get<char>& facet = std::use_facet<std::time_get<char>>(str.getloc());
    std::istreambuf_iterator<char> ret = facet.get_date({str}, {}, str, err, &t);
    str.setstate(err);
    
    if (str)
    {
        std::cout << "Day: " << t.tm_mday << ' '
                  << "Month: " << t.tm_mon + 1 << ' '
                  << "Year: " << t.tm_year + 1900 << '\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("en_US.utf8"));
    try_get_date("02/01/2013");
    try_get_date("02-01-2013");
    
    std::locale::global(std::locale("ja_JP.utf8"));
    try_get_date("2013年02月01日");
}

Вывод:

Parsing the date out of '02/01/2013' in the locale en_US.utf8
Day: 1 Month: 2 Year: 2013
Parsing the date out of '02-01-2013' in the locale en_US.utf8
Parse failed. Unparsed string: -01-2013
Parsing the date out of '2013年02月01日' in the locale ja_JP.utf8
Day: 1 Month: 2 Year: 2013

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

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

DR Применяется к Поведение согласно опубликованной версии Корректное поведение
LWG 248 C++98 eofbit не устанавливался при достижении конечного итератора устанавливает eofbit, если корректная дата не была считана
LWG 461 C++98 do_get_date требовался для разбора локализованного представления даты выполняет разбор с форматом, определяемым date_order()

См. также

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_date

Spec-Zone.ru

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