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,
char_type fill, const std::tm* t,
const CharT* fmtbeg, const CharT* fmtend ) const;
| (1) | |
public:
iter_type put( iter_type out, std::ios_base& str,
char_type fill, const std::tm* t,
char format, char modifier = 0 ) const;
| (2) | |
protected:
virtual iter_type do_put( iter_type out, std::ios_base& str,
char_type fill, const std::tm* t,
char format, char modifier ) const;
| (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 наиболее производного класса.std::tm, на который указывает t, в строку символов согласно последовательности преобразования формата, сформированной конкатенацией '%', значения modifier, если оно не равно '\0', и значения format. Формат интерпретируется так же, как функцией std::strftime, за исключением того, что форматы, описанные как зависящие от локали, определяются этой локалью, а также могут поддерживаться дополнительные спецификаторы формата (аргумент fill предоставляется для использования этими спецификаторами формата, определяемыми реализацией). Строка записывается в выходной итератор out.Параметры
| 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) | записывает день недели в виде десятичного числа, где понедельник — 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 | записывает часы в виде десятичного числа в 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 |
Возвращаемое значение
Итератор, указывающий на позицию сразу после последнего записанного символа.
Примечания
Обработка ошибок не предусмотрена.
Символ fill используется для определяемых реализацией спецификаторов формата и пользовательских переопределений 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) | форматирует и выводит значение даты/времени в соответствии с указанным форматом (шаблон функции) |
|
[виртуальная] (C++11) | извлекает компоненты даты/времени из входного потока в соответствии с указанным форматом (виртуальная защищённая функция-член класса std::time_get<CharT,InputIt>) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/locale/time_put/put