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) | |
根据 格式字符串 [fmtbeg, fmtend)
,将存储在 std::tm 对象(由 t 指向)中的日历日期和时间转换为字符串。格式字符串与 std::strftime 使用的格式字符串相同,但每个格式说明符都由对 do_put()
的单独调用处理,可以通过扩展此 facet 来自定义。
[fmtbeg, fmtend)
,检查字符。每个不是格式序列一部分的字符都立即写入输出迭代器 out。为了识别格式序列,此函数会缩小 [fmtbeg, fmtend)
中的下一个字符 c,如同通过 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
成员函数。目录 |
[edit] 参数
out | - | 输出迭代器,转换结果写入到这里 |
str | - | 流对象,此函数使用它在需要时获取区域设置 facet,例如 std::ctype 以缩小字符范围 |
t | - | 指向 std::tm 对象的指针,日期/时间值从该对象获取 |
fmtbeg | - | 指向 char_type 字符序列的第一个字符的指针,指定转换格式 |
fmtend | - | 指向 char_type 字符序列的最后一个字符之后位置的指针,指定转换格式 |
fill | - | 填充字符(通常是空格) |
format | - | 指定转换说明符的字符 |
modifier | - | 可选的修饰符,可能出现在 % 和转换说明符之间 |
[edit] 格式字符串
格式字符串由零个或多个转换说明符和普通字符(除了 %
)组成。所有普通字符,包括终止空字符,都将不经修改地复制到输出字符串。每个转换规范都以 %
字符开头,可选地后跟 E
或 O
修饰符(如果区域设置不支持则忽略),后跟确定说明符行为的字符。以下格式说明符可用
转换 说明符 |
解释 | 使用的字段 |
---|---|---|
%
|
写入字面量 % 。完整的转换规范必须是 %% 。 |
|
n (C++11) |
写入换行符 | |
t (C++11) |
写入水平制表符 | |
年份 | ||
Y
|
以十进制数形式写入年份,例如 2017 | tm_year
|
EY (C++11) |
以替代表示形式写入年份,例如 ja_JP 区域设置中,以平成23年(Heisei 23 年)代替 2011年(2011 年) | tm_year
|
y
|
以十进制数形式写入年份的后 2 位数字(范围 [00,99] ) |
tm_year
|
Oy (C++11) |
使用替代数字系统写入年份的后 2 位数字,例如 ja_JP 区域设置中,以 十一 代替 11 | tm_year
|
Ey (C++11) |
将年份写入为从区域设置的替代日历期间 %EC 的偏移量(与区域设置相关) |
tm_year
|
C (C++11) |
以十进制数形式写入年份的前 2 位数字(范围 [00,99] ) |
tm_year
|
EC (C++11) |
以区域设置的替代表示形式写入基准年份(期间)的名称,例如 ja_JP 中的 平成(Heisei 时代) | tm_year
|
G (C++11) |
写入 ISO 8601 基于周的年份,即包含指定周的年份。 在 ISO 8601 中,周从星期一开始,并且一年中的第一周必须满足以下要求
|
tm_year , tm_wday , tm_yday |
g (C++11) |
写入 ISO 8601 基于周的年份的后 2 位数字,即包含指定周的年份(范围 [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) |
使用替代数字系统写入月份,例如 ja_JP 区域设置中,以 十二 代替 12 | tm_mon
|
周 | ||
U
|
以十进制数形式写入一年中的第几周(星期日是一周的第一天)(范围 [00,53] ) |
tm_year , tm_wday , tm_yday |
OU (C++11) |
使用替代数字系统写入一年中的第几周,如同 %U ,例如 ja_JP 区域设置中,以 五十二 代替 52 |
tm_year , tm_wday , tm_yday |
W
|
以十进制数形式写入一年中的第几周(星期一是一周的第一天)(范围 [00,53] ) |
tm_year , tm_wday , tm_yday |
OW (C++11) |
使用替代数字系统写入一年中的第几周,如同 %W ,例如 ja_JP 区域设置中,以 五十二 代替 52 |
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 ,例如 ja_JP 区域设置中,以 五十二 代替 52 |
tm_year , tm_wday , tm_yday |
一年中的第几天/月份中的第几天 | ||
j
|
以十进制数形式写入一年中的第几天(范围 [001,366] ) |
tm_yday
|
d
|
以十进制数形式写入月份中的第几天(范围 [01,31] ) |
tm_mday
|
Od (C++11) |
使用替代数字系统写入从零开始的月份中的第几天,例如 ja_JP 区域设置中,以 二十七 代替 27 单字符前导空格。 |
tm_mday
|
e (C++11) |
以十进制数形式写入月份中的第几天(范围 [1,31] )。单数字前导空格。 |
tm_mday
|
Oe (C++11) |
使用替代数字系统写入从一开始的月份中的第几天,例如 ja_JP 区域设置中,以 二十七 代替 27 单字符前导空格。 |
tm_mday
|
星期几 | ||
a
|
写入缩写工作日名称,例如 Fri (与区域设置相关) |
tm_wday
|
A
|
写入完整工作日名称,例如 Friday (与区域设置相关) |
tm_wday
|
w
|
以十进制数形式写入星期几,其中星期日为 0 (范围 [0-6] ) |
tm_wday
|
Ow (C++11) |
使用替代数字系统写入星期几,其中星期日为 0 ,例如 ja_JP 区域设置中,以 二 代替 2 |
tm_wday
|
u (C++11) |
以十进制数形式写入星期几,其中星期一为 1 (ISO 8601 格式)(范围 [1-7] ) |
tm_wday
|
Ou (C++11) |
使用替代数字系统写入星期几,其中星期一为 1 ,例如 ja_JP 区域设置中,以 二 代替 2 |
tm_wday
|
小时、分钟、秒 | ||
H
|
以十进制数形式写入小时,24 小时制时钟(范围 [00-23] ) |
tm_hour
|
OH (C++11) |
使用替代数字系统从 24 小时制时钟写入小时,例如 ja_JP 区域设置中,以 十八 代替 18 | tm_hour
|
I
|
以十进制数形式写入小时,12 小时制时钟(范围 [01,12] ) |
tm_hour
|
OI (C++11) |
使用替代数字系统从 12 小时制时钟写入小时,例如 ja_JP 区域设置中,以 六 代替 06 | tm_hour
|
M
|
以十进制数形式写入分钟(范围 [00,59] ) |
tm_min
|
OM (C++11) |
使用替代数字系统写入分钟,例如 ja_JP 区域设置中,以 二十五 代替 25 | tm_min
|
S
|
以十进制数形式写入秒(范围 [00,60] ) |
tm_sec
|
OS (C++11) |
使用替代数字系统写入秒,例如 ja_JP 区域设置中,以 二十四 代替 24 | tm_sec
|
其他 | ||
c
|
写入标准日期和时间字符串,例如 Sun Oct 17 04:41:13 2010 (与区域设置相关) |
全部 |
Ec (C++11) |
写入替代日期和时间字符串,例如 ja_JP 区域设置中,以平成23年(Heisei 23 年)代替 2011年(2011 年) | 全部 |
x
|
写入本地化的日期表示形式(与区域设置相关) | 全部 |
Ex (C++11) |
写入替代日期表示形式,例如 ja_JP 区域设置中,以平成23年(Heisei 23 年)代替 2011年(2011 年) | 全部 |
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) |
以 ISO 8601 格式写入与 UTC 的偏移量(例如 -0430 ),如果时区信息不可用,则不写入任何字符 |
tm_isdst
|
Z
|
写入与区域设置相关的时区名称或缩写,如果时区信息不可用,则不写入任何字符 | tm_isdst
|
[edit] 返回值
指向所生成最后一个字符之后位置的迭代器。
[edit] 注解
不提供错误处理。
fill 字符是为那些实现定义的格式说明符以及使用填充逻辑的 do_put()
用户定义重载提供的。此类实现通常使用来自 str 的格式化标志。
[edit] 示例
#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秒'
[edit] 缺陷报告
以下行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。
DR | 应用于 | 已发布行为 | 正确行为 |
---|---|---|---|
LWG 164 | C++98 | 参数 fill 的目的不明确 | 已明确 |
[edit] 参见
(C++11) |
根据指定的格式格式化和输出日期/时间值 (函数模板) |
[virtual] (C++11) |
根据指定的格式从输入流中提取日期/时间组件 ( std::time_get<CharT,InputIt> 的虚保护成员函数) |