Spec-Zone.ru › C++

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(), который может быть настроен путем расширения данного аспекта.

1) Проходит по последовательности символов [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' используется, если модификатор отсутствует.
2) Вызывает функцию-член do_put наиболее производного класса.
3) Преобразует календарную дату и время, хранящиеся в объекте 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 недели начинаются с понедельника, и первая неделя года должна удовлетворять следующим требованиям:

  • Включает 4 января
  • Включает первый четверг года
tm_year, tm_wday, tm_yday
g
(C++11)
записывает последние 2 цифры года по ISO 8601, основанного на неделе, т. е. года, содержащего указанную неделю (диапазон [00,99]).

В ISO 8601 недели начинаются с понедельника, и первая неделя года должна удовлетворять следующим требованиям:

  • Включает 4 января
  • Включает первый четверг года
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 недели начинаются с понедельника, и первая неделя года должна удовлетворять следующим требованиям:

  • Включает 4 января
  • Включает первый четверг года
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)
записывает день месяца (от 1) с использованием альтернативной числовой системы, например 二十七 вместо 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++.

Отчёт об ошибке Применён к Поведение в опубликованном варианте Корректное поведение
LWG 164 C++98 цель параметра fill не была ясна яснее определена

См. также

put_time
(C++11)
форматирует и выводит значение даты/времени в соответствии с заданным форматом
(функция-шаблон)
do_get
[virtual] (C++11)
извлекает компоненты даты/времени из входного потока в соответствии с заданным форматом
(виртуальная защищённая функция-член класса std::time_get<CharT,InputIt>)

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

Spec-Zone.ru

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