std::time_put<CharT,OutputIt>:: put, std::time_put<CharT,OutputIt>:: do_put
|
Определено в заголовочном файле
<locale>
|
||
|
public
:
iter_type put
(
iter_type out,
std::
ios_base
&
str,
|
(1) | |
|
public
:
iter_type put
(
iter_type out,
std::
ios_base
&
str,
|
(2) | |
|
protected
:
virtual
iter_type do_put
(
iter_type out,
std::
ios_base
&
str,
|
(3) | |
Преобразует календарную дату и время, хранящиеся в объекте
std::tm
, на который указывает
t
, в строку символов в соответствии с
строкой формата
[fmtbeg, fmtend)
. Строка формата аналогична используемой в
std::
strftime
, но каждый спецификатор формата обрабатывается отдельным вызовом
do_put()
, который может быть кастомизирован путём наследования этого фасета.
[fmtbeg, fmtend)
, анализируя символы. Каждый символ, который не является частью форматной последовательности, немедленно записывается в выходной итератор
out
. Для идентификации форматных последовательностей эта функция сужает следующий символ
c
в
[fmtbeg, fmtend)
как если бы с помощью
std::
ctype
<
char_type
>
(
str.
getloc
(
)
)
.
narrow
(
c,
0
)
и если он равен
'%'
, следующие один или два символа сравниваются со списком форматных последовательностей, распознаваемых
std::strftime
плюс любые дополнительные определяемые реализацией форматы, поддерживаемые данной локалью. Для каждой допустимой форматной последовательности выполняется вызов
do_put
(
out, str, fill, t, format, modifier
)
, где
format
- это символ форматной последовательности, а
modifier
- опциональный модификатор форматной последовательности (
'E'
или
'O'
). Значение
'
\0
'
используется, если модификатор отсутствует.
do_put
функцию-член самого производного класса.
Содержание |
Параметры
| out | - | выходной итератор, куда записывается результат преобразования |
| str | - | объект потока, который эта функция использует для получения локалей при необходимости, например std::ctype для сужения символов |
| t | - | указатель на объект std::tm из которого получаются значения даты/времени |
| fmtbeg | - |
указатель на первый символ последовательности символов
char_type
определяющей
формат преобразования
|
| fmtend | - |
указатель на символ, следующий за последним символом последовательности символов
char_type
определяющей
формат преобразования
|
| fill | - | символ заполнения (обычно пробел) |
| format | - | символ, который обозначает спецификатор преобразования |
| modifier | - |
опциональный модификатор, который может появляться между
%
и
спецификатором преобразования
|
Строка формата
Строка формата состоит из нуля или более спецификаторов преобразования и обычных символов (за исключением
%
). Все обычные символы, включая завершающий нулевой символ, копируются в выходную строку без изменений. Каждая спецификация преобразования начинается с символа
%
, за которым может следовать модификатор
E
или
O
(игнорируется, если не поддерживается локалью), после которого следует символ, определяющий поведение спецификатора. Доступны следующие спецификаторы формата:
|
Спецификатор
преобразования |
Объяснение | Используемые поля |
|---|---|---|
%
|
выводит символ
%
. Полная спецификация преобразования должна быть
%%
.
|
|
n
(C++11) |
записывает символ новой строки | |
t
(C++11) |
записывает символ горизонтальной табуляции | |
| Год | ||
Y
|
записывает год в виде десятичного числа, например 2017 |
tm_year
|
EY
(C++11) |
записывает год в альтернативном представлении, например, 平成23年 (год Хэйсэй 23) вместо 2011年 (год 2011) в локали ja_JP |
tm_year
|
y
|
записывает последние 2 цифры
года
в виде десятичного числа (диапазон
[00,99]
)
|
tm_year
|
Oy
(C++11) |
записывает последние 2 цифры года с использованием альтернативной числовой системы, например 十一 вместо 11 в локали ja_JP |
tm_year
|
Ey
(C++11) |
записывает
год
как смещение от периода альтернативного календаря локали
%EC
(зависит от локали)
|
tm_year
|
C
(C++11) |
записывает первые 2 цифры
года
в виде десятичного числа (диапазон
[00,99]
)
|
tm_year
|
EC
(C++11) |
записывает название базового года (периода) в альтернативном представлении локали, например 平成 (эра Хэйсэй) в ja_JP |
tm_year
|
G
(C++11) |
записывает
год по неделям ISO 8601
, т.е. год, который содержит указанную неделю.
В стандарте ISO 8601 недели начинаются с понедельника, и первая неделя года должна удовлетворять следующим требованиям:
|
tm_year
,
tm_wday
,
tm_yday
|
g
(C++11) |
записывает последние 2 цифры
ISO 8601 недельного года
, т.е. года, содержащего указанную неделю (диапазон
[00,99]
).
В стандарте ISO 8601 недели начинаются с понедельника, и первая неделя года должна удовлетворять следующим требованиям:
|
tm_year
,
tm_wday
,
tm_yday
|
| Месяц | ||
b
|
записывает
сокращенное название месяца
, например
Oct
(зависит от локали)
|
tm_mon
|
h
(C++11) |
синоним
b
|
tm_mon
|
B
|
записывает
полное название месяца
, например
October
(зависит от локали)
|
tm_mon
|
m
|
записывает
месяц
в виде десятичного числа (диапазон
[01,12]
)
|
tm_mon
|
Om
(C++11) |
записывает месяц с использованием альтернативной числовой системы, например 十二 вместо 12 в локали ja_JP |
tm_mon
|
| Неделя | ||
U
|
записывает
неделю года
в виде десятичного числа (воскресенье является первым днём недели) (диапазон
[00,53]
)
|
tm_year
,
tm_wday
,
tm_yday
|
OU
(C++11) |
записывает
неделю года
, как в
%U
, используя альтернативную числовую систему, например 五十二 вместо 52 в локали ja_JP
|
tm_year
,
tm_wday
,
tm_yday
|
W
|
записывает
неделю года
в виде десятичного числа (понедельник является первым днём недели) (диапазон
[00,53]
)
|
tm_year
,
tm_wday
,
tm_yday
|
OW
(C++11) |
записывает
неделю года
, как в
%W
, используя альтернативную числовую систему, например 五十二 вместо 52 в локали ja_JP
|
tm_year
,
tm_wday
,
tm_yday
|
V
(C++11) |
записывает
неделю года по ISO 8601
(диапазон
[01,53]
).
В стандарте ISO 8601 недели начинаются с понедельника, и первая неделя года должна удовлетворять следующим требованиям:
|
tm_year
,
tm_wday
,
tm_yday
|
OV
(C++11) |
записывает
неделю года
, как в
%V
, используя альтернативную числовую систему, например 五十二 вместо 52 в локали ja_JP
|
tm_year
,
tm_wday
,
tm_yday
|
| День года/месяца | ||
j
|
записывает
день года
в виде десятичного числа (диапазон
[001,366]
)
|
tm_yday
|
d
|
записывает
день месяца
в виде десятичного числа (диапазон
[01,31]
)
|
tm_mday
|
Od
(C++11) |
записывает начинающийся с нуля
день месяца
с использованием альтернативной числовой системы, например 二十七 вместо 27 в локали ja_JP
Одиночный символ предваряется пробелом. |
tm_mday
|
e
(C++11) |
записывает
день месяца
в виде десятичного числа (диапазон
[1,31]
).
Однозначное число предваряется пробелом. |
tm_mday
|
Oe
(C++11) |
записывает
день месяца
с единицы
используя альтернативную числовую систему, например 二十七 вместо 27 в локали ja_JP
Одиночный символ предваряется пробелом. |
tm_mday
|
| День недели | ||
a
|
выводит
сокращенное название дня недели
, например
Fri
(зависит от локали)
|
tm_wday
|
A
|
записывает
полное название дня недели
, например
Friday
(зависит от локали)
|
tm_wday
|
w
|
записывает
день недели
в виде десятичного числа, где воскресенье равно
0
(диапазон
[0-6]
)
|
tm_wday
|
Ow
(C++11) |
записывает
день недели
, где воскресенье равно
0
, используя альтернативную числовую систему, например 二 вместо 2 в локали ja_JP
|
tm_wday
|
u
(C++11) |
записывает
weekday
в виде десятичного числа, где понедельник соответствует
1
(формат ISO 8601) (диапазон
[1-7]
)
|
tm_wday
|
Ou
(C++11) |
записывает
день недели
, где понедельник соответствует
1
, используя альтернативную числовую систему, например 二 вместо 2 в локали ja_JP
|
tm_wday
|
| Час, минута, секунда | ||
H
|
записывает
час
в виде десятичного числа, 24-часовой формат (диапазон
[00-23]
)
|
tm_hour
|
OH
(C++11) |
записывает час из 24-часового формата с использованием альтернативной числовой системы, например 十八 вместо 18 в локали ja_JP |
tm_hour
|
I
|
записывает
hour
в виде десятичного числа, 12-часовой формат (диапазон
[01,12]
)
|
tm_hour
|
OI
(C++11) |
записывает час по 12-часовым часам с использованием альтернативной числовой системы, например 六 вместо 06 в локали ja_JP |
tm_hour
|
M
|
записывает
минуту
в виде десятичного числа (диапазон
[00,59]
)
|
tm_min
|
OM
(C++11) |
записывает минуту используя альтернативную числовую систему, например 二十五 вместо 25 в локали ja_JP |
tm_min
|
S
|
записывает
секунды
в виде десятичного числа (диапазон
[00,60]
)
|
tm_sec
|
OS
(C++11) |
записывает секунды используя альтернативную числовую систему, например 二十四 вместо 24 в локали ja_JP |
tm_sec
|
| Другое | ||
c
|
записывает
стандартную строку даты и времени
, например
Sun Oct 17 04:41:13 2010
(зависит от локали)
|
все |
Ec
(C++11) |
записывает альтернативную строку даты и времени , например, используя 平成23年 (год Хэйсэй 23) вместо 2011年 (год 2011) в локали ja_JP | все |
x
|
записывает локализованное представление даты (зависит от локали) | все |
Ex
(C++11) |
записывает альтернативное представление даты , например, используя 平成23年 (год Хэйсэй 23) вместо 2011年 (год 2011) в локали ja_JP | все |
X
|
выводит локализованное представление времени , например 18:40:20 или 6:40:20 PM (зависит от локали) | все |
EX
(C++11) |
записывает альтернативное представление времени (зависит от локали) | все |
D
(C++11) |
эквивалентно "%m/%d/%y" |
tm_mon
,
tm_mday
,
tm_year
|
F
(C++11) |
эквивалентно "%Y-%m-%d" (формат даты ISO 8601) |
tm_mon
,
tm_mday
,
tm_year
|
r
(C++11) |
записывает локализованное 12-часовое время (зависит от локали) |
tm_hour
,
tm_min
,
tm_sec
|
R
(C++11) |
эквивалентно "%H:%M" |
tm_hour
,
tm_min
|
T
(C++11) |
эквивалентно "%H:%M:%S" (формат времени ISO 8601) |
tm_hour
,
tm_min
,
tm_sec
|
p
|
выводит локализованное a.m. или p.m. (зависит от локали) |
tm_hour
|
z
(C++11) |
записывает
смещение от UTC
в формате ISO 8601 (например,
-0430
), или не выводит символы, если информация о часовом поясе недоступна
|
tm_isdst
|
Z
|
записывает зависящее от локали название часового пояса или аббревиатуру , или не выводит символы, если информация о часовом поясе недоступна |
tm_isdst
|
Возвращаемое значение
Итератор, указывающий на позицию после последнего произведённого символа.
Примечания
Обработка ошибок не предусмотрена.
Символ заполнения предоставляется для тех спецификаторов формата, определяемых реализацией, и для пользовательских переопределений
do_put()
, которые используют логику заполнения и выравнивания. Такие реализации обычно используют флаги форматирования из
str
.
Пример
#include <iostream> #include <sstream> #include <iomanip> #include <ctime> void try_time_put(const std::tm* t, const std::string& fmt) { std::cout.imbue(std::locale()); std::cout << "In the locale '" << std::cout.getloc().name() << "' : '"; std::use_facet<std::time_put<char>>(std::cout.getloc()).put( {std::cout}, std::cout, ' ', t, &fmt[0], &fmt[0] + fmt.size()); std::cout << "'\n"; } int main() { std::time_t t = std::time(NULL); std::tm tm = *std::localtime(&t); std::string fmt = "%c"; std::cout << "Using the format string '" << fmt << "' to format the time: " << std::ctime(&t) << '\n'; std::locale::global(std::locale("de_DE.utf8")); try_time_put(&tm, fmt); std::locale::global(std::locale("el_GR.utf8")); try_time_put(&tm, fmt); std::locale::global(std::locale("ja_JP.utf8")); try_time_put(&tm, fmt); }
Возможный вывод:
Using the format string '%c' to format the time: Mon Feb 11 22:58:50 2013 In the locale 'de_DE.utf8' : 'Mo 11 Feb 2013 23:02:38 EST' In the locale 'el_GR.utf8' : 'Δευ 11 Φεβ 2013 11:02:38 μμ EST' In the locale 'ja_JP.utf8' : '2013年02月11日 23時02分38秒'
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применяется к | Поведение в опубликованной версии | Корректное поведение |
|---|---|---|---|
| LWG 164 | C++98 | назначение параметра fill было неясным | прояснено |
Смотрите также
|
(C++11)
|
форматирует и выводит значение даты/времени согласно указанному формату
(шаблон функции) |
|
[virtual]
(C++11)
|
извлекает компоненты даты/времени из входного потока согласно указанному формату
(виртуальная защищенная функция-член
std::time_get<CharT,InputIt>
)
|