std::formatter<std::chrono::zoned_time>, std::chrono::local_time_format
Определено в заголовке <chrono> | ||
|---|---|---|
template< class Duration, class TimeZonePtr, class CharT >
struct formatter<std::chrono::zoned_time<Duration, TimeZonePtr>, CharT>
: std::formatter</*local-time-format-t*/
<std::common_type_t<Duration,
std::chrono::seconds>>, CharT>
| (1) | (начиная с C++20) |
template< class Duration >
/*local-time-format-t*/<Duration>
local_time_format( const std::chrono::local_time<Duration>& tp,
const std::string* abbrev = nullptr,
const std::chrono::seconds* offset_sec = nullptr );
| (2) | (начиная с C++20) |
| Вспомогательные шаблоны | ||
template< class Duration >
struct /*local-time-format-t*/
{
std::chrono::local_time<Duration> /*time*/;
const std::string* /*abbrev*/;
const std::chrono::seconds* /*offset_sec*/;
};
| (3) |
(начиная с C++20) (только для описания) |
template< class Duration, class CharT > struct formatter</*local-time-format-t*/<Duration>, CharT>; | (4) | (начиная с C++20) |
std::formatter, определяющая правила форматирования для std::chrono::zoned_time. - Член
parseнаследуется от базового класса. - Пусть
tp— аргумент форматирования, аctx— контекст форматирования; поведение членаformatэквивалентно следующему:
using common_duration_type = std::common_type_t<Duration, std::chrono::seconds>; using formatter_type = std::formatter<local-time-format-t <common_duration_type>; std::chrono::sys_info info = tp.get_info(); return formatter_type::format({tp.get_local_time(), &info.abbrev, &info.offset_sec}), ctx);
std::chrono::zoned_time.{time, abbrev, offset_sec}.std::chrono::zoned_time: -
abbrevсодержит аббревиатуру часового пояса. -
offset_secсодержит смещение относительно UTC. -
timeсодержит все остальные необходимые сведения.
std::formatter, определяющая базовые правила форматирования для std::chrono::zoned_time.f — аргумент форматирования; специализация имеет следующие дополнительные правила форматирования: - Если chrono-spec не указан, результат эквивалентен использованию
%F %T %Zв качестве chrono-spec . - Если используется
%Z, он заменяется на*f.abbrev, еслиf.abbrevне является нулевым указателем; в противном случае выбрасывается исключение типаstd::format_error. - Если используется
%zили изменённый вариант%z, он заменяется на*f.offset_sec, еслиf.offset_secне является нулевым указателем; в противном случае выбрасывается исключение типаstd::format_error.
Специализация std::formatter обычно не используется напрямую, а применяется через функции форматирования.
Спецификация формата
Спецификация формата имеет следующий вид
fill-and-align (необязательно) width (необязательно) precision (необязательно) L(необязательно) chrono-spec (необязательно) |
fill-and-align, width и precision имеют то же значение, что и в стандартной спецификации формата. precision допустим только для типов std::chrono::duration, у которых тип представления Rep является типом с плавающей точкой; в противном случае выбрасывается std::format_error.
Локаль, используемая для форматирования, определяется следующим образом:
- локаль "C" по умолчанию, если в спецификации формата отсутствует
L, - в противном случае — локаль, обозначаемая
std::locale, переданной функции форматирования, если такая есть, - в противном случае (
Lприсутствует, но функции форматирования не передан объектstd::locale) — глобальная локаль.
Если кодировка строковых литералов (обычных или широких) является формой кодирования Unicode, а локаль входит в определённый реализацией набор локалей, каждая замена, зависящая от локали, выполняется так, как если бы последовательность символов замены преобразовывалась в кодировку литерала.
chrono-spec состоит из одного или нескольких спецификаторов преобразования и обычных символов (кроме {, } и %). chrono-spec должен начинаться со спецификатора преобразования. Все обычные символы выводятся без изменений. Каждый неизменённый спецификатор преобразования начинается с символа %, за которым следует символ, определяющий поведение спецификатора. Некоторые спецификаторы преобразования имеют изменённую форму, в которой после символа % вставляется символ-модификатор E или O. Каждый спецификатор преобразования заменяется в выходных данных соответствующими символами, как описано ниже.
Если не указано иное и chrono-spec пуст, объект chrono форматируется так, как если бы он был передан в потоковый вывод посредством оператора потокового вывода в объект os типа std::basic_ostringstream<CharT>, которому задана локаль форматирования (одна из std::locale::classic(), переданного объекта std::locale и std::locale::global()) с помощью imbue, после чего os.str() копируется в выходной буфер с дополнительным заполнением и корректировками в соответствии со спецификаторами формата.
Доступны следующие спецификаторы формата:
| Спецификатор преобразования | Описание | |
|---|---|---|
%% | Выводит буквальный символ %. |
|
%n | Выводит символ новой строки. | |
%t | Выводит символ горизонтальной табуляции. | |
| Год | ||
%C %EC | Выводит год, делённый на 100 с округлением вниз. Если результат состоит из одной десятичной цифры, перед ней добавляется 0. Изменённая команда |
|
%y %Oy %Ey | Выводит две последние десятичные цифры года. Если результат состоит из одной цифры, перед ней добавляется 0. Изменённая команда Изменённая команда |
|
%Y %EY | Выводит год десятичным числом. Если результат содержит менее четырёх цифр, слева добавляются нули до четырёх цифр. Изменённая команда |
|
| Месяц | ||
%b%h | Выводит сокращённое название месяца в соответствии с локалью. | |
%B | Выводит полное название месяца в соответствии с локалью. | |
%m%Om | Выводит месяц десятичным числом (январь — 01). Если результат состоит из одной цифры, перед ней добавляется 0. Изменённая команда |
|
| День | ||
%d%Od | Выводит день месяца десятичным числом. Если результат состоит из одной десятичной цифры, перед ней добавляется 0. Изменённая команда |
|
%e%Oe | Выводит день месяца десятичным числом. Если результат состоит из одной десятичной цифры, перед ней добавляется пробел. Изменённая команда |
|
| День недели | ||
%a | Выводит сокращённое название дня недели в соответствии с локалью. | |
%A | Выводит полное название дня недели в соответствии с локалью. | |
%u%Ou | Выводит день недели по ISO десятичным числом (1–7), где понедельник — 1. Изменённая команда |
|
%w%Ow | Выводит день недели десятичным числом (0–6), где воскресенье — 0. Изменённая команда |
|
| Неделя ISO 8601 и год | ||
| В ISO 8601 недели начинаются в понедельник, а первая неделя года должна соответствовать следующим требованиям:
|
||
%g | Выводит две последние десятичные цифры года по неделям ISO 8601. Если результат состоит из одной цифры, перед ней добавляется 0. | |
%G | Выводит год по неделям ISO 8601 десятичным числом. Если результат содержит менее четырёх цифр, слева добавляются нули до четырёх цифр. | |
%V%OV | Выводит номер недели года по ISO 8601 десятичным числом. Если результат состоит из одной цифры, перед ней добавляется 0. Изменённая команда |
|
| Неделя / день года | ||
%j | Выводит день года десятичным числом (1 января — 001). Если результат содержит менее трёх цифр, слева добавляются нули до трёх цифр. |
|
%U%OU | Выводит номер недели года десятичным числом. Первое воскресенье года — первый день недели 01. Дни того же года до него относятся к неделе 00. Если результат состоит из одной цифры, перед ней добавляется 0. Изменённая команда |
|
%W%OW | Выводит номер недели года десятичным числом. Первый понедельник года — первый день недели 01. Дни того же года до него относятся к неделе 00. Если результат состоит из одной цифры, перед ней добавляется 0. Изменённая команда |
|
| Дата | ||
%D | Эквивалентно "%m/%d/%y". |
|
%F | Эквивалентно "%Y-%m-%d". |
|
%x%Ex | Выводит представление даты в соответствии с локалью. Изменённая команда |
|
| Время суток | ||
%H%OH | Выводит часы (24-часовой формат) десятичным числом. Если результат состоит из одной цифры, перед ней добавляется 0. Изменённая команда |
|
%I%OI | Выводит часы (12-часовой формат) десятичным числом. Если результат состоит из одной цифры, перед ней добавляется 0. Изменённая команда |
|
%M%OM | Выводит минуты десятичным числом. Если результат состоит из одной цифры, перед ней добавляется 0. Изменённая команда |
|
%S%OS | Выводит секунды десятичным числом. Если число секунд меньше 10, перед результатом добавляется 0. Если точность входных данных не может быть точно представлена в секундах, результатом будет десятичное число с фиксированным форматом и точностью, соответствующей точности входных данных (или с точностью до микросекунд, если преобразование в десятичные секунды с плавающей точкой невозможно выполнить с точностью до 18 дробных цифр). Символ десятичной точки определяется локалью. Изменённая команда |
|
%p | Выводит соответствующее локали обозначение AM/PM для 12-часового формата. | |
%R | Эквивалентно "%H:%M". |
|
%T | Эквивалентно "%H:%M:%S". |
|
%r | Выводит время в 12-часовом формате в соответствии с локалью. | |
%X%EX | Выводит представление времени в соответствии с локалью. Изменённая команда |
|
| Часовой пояс | ||
%z%Ez%Oz | Выводит смещение относительно UTC в формате ISO 8601. Например, -0430 означает, что время на 4 часа 30 минут отстаёт от UTC. Если смещение равно нулю, используется +0000. Изменённые команды |
|
%Z | Выводит аббревиатуру часового пояса. | |
| Прочее | ||
%c%Ec | Выводит представление даты и времени в соответствии с локалью. Изменённая команда |
|
Следующие спецификаторы распознаются, но приводят к выбрасыванию std::format_error:
| Спецификатор преобразования | Описание | |
|---|---|---|
| Количество тактов длительности | ||
%Q | Выводит количество тактов длительности, то есть значение, полученное с помощью count(). |
|
%q | Выводит суффикс единицы измерения длительности, как указано в operator<<(). |
|
Пример
Сообщения об ошибках стандарта
Следующие отчёты об ошибках, изменяющие поведение, были ретроактивно применены к ранее опубликованным стандартам C++.
| DR | Применён к | Опубликованное поведение | Корректное поведение |
|---|---|---|---|
| LWG 4124 | C++20 | 1. chrono-spec нельзя было опустить 2. zoned_time нельзя было форматироватьс точностью грубее секунд | 1. его можно опустить 2. можно форматировать с такой точностью |
| P2372R3 | C++20 |
formatter использовал глобальную или переданную локаль | если L отсутствует, используется локаль "C" по умолчанию |
См. также
|
(C++20) | сохраняет отформатированное представление аргументов в новой строке (шаблон функции) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/chrono/zoned_time/formatter