Шаг 541.
Библиотека STL. Интернационализация. Числовое форматирование. Форматирование времени и даты. Лексический разбор

    На этом шаге мы рассмотрим различные способы формирования порядка вывода даты и времени.

    Фацет time_get представляет собой шаблон, в аргументах которого передаются тип символов charT и тип итератора ввода InIt. По умолчанию итератор ввода относится к типу istreambuf_iterator<charT>. В таблице 1 перечислены функции, определенные для фацета time_getю Все эти функции, за исключением date_order(), обрабатывают строку и сохраняют результаты в объекте tm, на который ссылается аргумент t. Если попытка разбора завершается неудачей, функции либо выставляют признак ошибки (например, модификацией аргумента err), либо сохраняют неопределенное значение. Это означает, что надежная обработка гарантирована для времени, сгенерированного программой, но не для времени, введенного пользователем.

Таблица 1. Функции фацета time_get
Выражение Описание
tg.get_time(beg, end, fmt, err, t) Разбирает строку между beg и end как время, сгенерированное функцией strftime() со спецификатором X
tg.get_date(beg, end, fmt, err, t) Разбирает строку между beg и end как дату, сгенерированную функцией strftime() со спецификатором X
tg.get_weekday(beg, end, fmt, err, t) Разбирает строку между beg и end как название дня недели
tg.get_monthname(beg, end, fmt, err, t) Разбирает строку между beg и end как название месяца
tg.get_year(beg, end, fmt, err, t) Разбирает строку между beg и end как год
tg.date_order() Возвращает порядок следования компонентов даты, используемый фацетом

    Все функции возвращают итератор, установленный в позицию за последним прочитанным символом. Разбор прекращается при успешном завершении или в случае ошибки (например, если строка не интерпретируется как дата).

    Функция, читающая название дня недели или месяца, читает как сокращенные, так и полные названия. Если за сокращением следует буква, допустимая для полного названия, функция пытается прочитать полное название. Если это сделать не удается, разбор завершается неудачей, несмотря на успешный разбор сокращенного названия.

    В стандарте не сказано, должны ли при разборе года поддерживаться обозначения из двух цифр. Также не определено, какой именно год должен сопоставляться такому сокращению.

    Функция date_order() возвращает порядок следования дня, месяца и года в строке даты. Это необходимо для некоторых дат, которые не позволяют определить нужный порядок по текстовому представлению даты. Например, 1 февраля 2003 года может выводиться как в виде 3/2/1, так и в виде 1/2/3. В классе time_base, базовом для фацета time_get, определен перечисляемый тип dateorder с возможными порядками следования компонентов даты. Значения этого типа перечислены в таблице 2.

Таблица 2. Значения перечисляемого типа dateorder
Значение Описание
no_order Определенный порядок отсутствует (например, дата по юлианскому календарю)
dmy День, месяц, год
mdy Месяц, день, год
ymd Год, месяц, день
ydm Год, день, месяц

    Стандарт требует, чтобы в каждом локальном контексте хранились две специализации time_get<char> и time_get<wchar_t> (в обеих специализациях для второго аргумента используется значение по умолчанию). Кроме того, стандартная библиотека C++ поддерживает все специализации, у которых в первом аргументе шаблона передается тип символа, а во втором - тип итератора ввода. Стандарт не требует, чтобы эти специализации хранились в каждом локальном контексте.

    На следующем шаге мы рассмотрим форматирование.




Предыдущий шаг Содержание Следующий шаг