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()
的单独调用来处理的,可以通过扩展此语言环境面来定制该调用。
[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
成员函数。内容 |
[编辑] 参数
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) |
以备用表示形式写入年份,例如,在 ja_JP 语言环境中,写为平成23年(平成 23 年)而不是 2011年(2011 年) | tm_year
|
y
|
将年份的后两位数字写为十进制数字(范围为 [00,99] ) |
tm_year
|
Oy (C++11) |
使用备用数字系统写入年份的后两位数字,例如在 ja_JP 地区使用 十一 而不是 11。 | tm_year
|
Ey (C++11) |
将年份写入为相对于区域设置的备用日历时期 %EC 的偏移量(与区域设置相关)。 |
tm_year
|
C (C++11) |
将年份的前两位数字写入为十进制数(范围 [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 周为基准的年份的后两位数字,即包含指定周的年份(范围 [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年 (year Heisei 23) 而不是 2011年 (year 2011)。 | 所有 |
x
|
写入本地化的日期表示(与区域设置相关)。 | 所有 |
Ex (C++11) |
写入备用日期表示,例如在 ja_JP 地区使用 平成23年 (year Heisei 23) 而不是 2011年 (year 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
|
写入本地化的上午或下午(与区域设置相关)。 | 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> 的虚拟受保护成员函数) |