std:: formatter <std::chrono::sys_time>
|
定义于头文件
<chrono>
|
||
|
template
<
class
Duration,
class
CharT
>
struct formatter < std:: chrono :: sys_time < Duration > , CharT > ; |
(C++20 起) | |
针对 std::formatter 的特化,用于定义 std::chrono::sys_time 的格式化规则。
-
如果使用了
%Z,它将被替换为 "UTC" 并扩展为CharT类型。 -
如果使用了
%z或其修改变体,将格式化0min的偏移量。
std::formatter 的特化通常不直接访问,而是通过 格式化函数 使用。
目录 |
格式规范
格式规范具有以下形式
填充与对齐
(可选)
宽度
(可选)
精度
(可选)
L
(可选)
时间规范
(可选)
|
|||||||||
fill-and-align
、
width
和
precision
的含义与
标准格式规范
中的定义相同。
precision
仅当
std::chrono::duration
类型的表示类型
Rep
为浮点类型时有效,否则将抛出
std::format_error
。
用于格式化的区域设置按以下方式确定:
-
若格式规范中不存在
L,则使用默认的 "C" 区域设置, - 否则,使用传递给格式化函数的 std::locale 所指示的区域设置(若存在),
-
否则(存在
L但未向格式化函数传递 std::locale ),则使用全局区域设置。
如果 (普通或宽)字符串字面值编码 是Unicode编码形式且区域设置属于实现定义的区域设置集合,则每个依赖于区域设置的替换操作会如同将替换字符序列转换为字面值编码般执行。
chrono-spec
由一个或多个转换说明符和普通字符(除
{
、
}
和
%
外)组成。
chrono-spec
必须以转换说明符开头。所有普通字符均会不经修改地写入输出。每个未修改的转换说明符以
%
字符开头,后接一个决定说明符行为的字符。部分转换说明符具有修改形式,即在
%
字符后插入
E
或
O
修饰符字符。如下所述,每个转换说明符将被输出中的相应字符替换。
除非另有说明,若
chrono-spec
为空,则时间对象的格式化方式等同于将其
流式输出
到类型为
std::
basic_ostringstream
<
CharT
>
的对象
os
,该对象需植入格式化区域设置(可为
std::
locale
::
classic
(
)
、传入的
std::locale
对象或
std::
locale
::
global
(
)
之一),随后将
os.
str
(
)
复制到输出缓冲区,并根据格式说明符进行额外填充和对齐调整。
以下格式说明符可用:
|
转换
说明符 |
说明 | |
|---|---|---|
%%
|
写入字面量
%
字符。
|
|
%n
|
写入换行符。 | |
%t
|
写入水平制表符。 | |
| 年份 | ||
%C
%EC
|
使用向下取整除法写入年份除以100的结果。若结果为单个十进制数字,则前缀补0。
修改命令
|
|
%y
%Oy
%Ey
|
写入年份的最后两位十进制数字。若结果为单个数字,则前缀补0。
修改命令
修改命令
|
|
%Y
%EY
|
以十进制数字形式写入年份。若结果不足四位数字,则左侧补0至四位。
修改命令
|
|
| 月份 | ||
%b
%h
|
写入区域设置的缩写月份名称。 | |
%B
|
写入区域设置的完整月份名称。 | |
%m
%Om
|
以十进制数字形式写入月份(1月为
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基于周的年份。若结果不足四位数字,则左侧补0至四位。 | |
%V
%OV
|
以十进制数字形式写入ISO 8601年份中的周数。若结果为单个数字,则前缀补0。
修改命令
|
|
| 年中的周/日 | ||
%j
|
以十进制数字形式写入年中的日期(1月1日为
001
)。若结果不足三位数字,则左侧补0至三位。
|
|
%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
|
写入与12小时制相关的区域设置等效的AM/PM指示符。 | |
%R
|
等同于
"%H:%M"
。
|
|
%T
|
等同于
"%H:%M:%S"
。
|
|
%r
|
写入区域设置的12小时制时间。 | |
%X
%EX
|
写入区域设置的时间表示形式。
修改命令
|
|
| 时区 | ||
%z
%Ez
%Oz
|
以ISO 8601格式写入与UTC的偏移量。例如
-0430
表示比UTC晚4小时30分钟。若偏移量为零,则使用
+0000
。
修改命令
|
|
%Z
|
写入时区缩写。 | |
| 其他 | ||
%c
%Ec
|
写入区域设置的日期和时间表示形式。
修改命令
|
|
以下标识符可被识别,但会导致抛出 std::format_error :
|
转换
说明符 |
说明 | |
|---|---|---|
| 时长计数 | ||
%Q
|
输出时长的滴答计数,即通过 count() 获得的值。 | |
%q
|
输出时长的单位后缀,如 operator<<() 所指定。 | |
示例
#include <chrono> #include <format> #include <iostream> int main() { std::chrono::time_point<std::chrono::utc_clock> epoch; std::cout << std::format("The time of the Unix epoch was {0:%F}T{0:%R%z}.", epoch) << '\n'; }
输出:
The time of the Unix epoch was 1970-01-01T00:00+0000.
缺陷报告
以下行为变更缺陷报告被追溯应用于先前发布的C++标准。
| DR | 适用范围 | 发布时的行为 | 正确行为 |
|---|---|---|---|
| P2372R3 | C++20 |
formatter
使用全局区域设置或传入的区域设置
|
当
L
不存在时使用默认的
"C"
区域设置
|
参见
|
(C++20)
|
将参数的格式化表示存储于新字符串中
(函数模板) |