命名空间
变体
操作

std::time_put<CharT,OutputIt>::put, std::time_put<CharT,OutputIt>::do_put

来自 cppreference.com
< cpp‎ | locale‎ | time put
 
 
 
std::time_put
成员函数
time_put::puttime_put::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)

根据 格式字符串 [fmtbeg, fmtend),将存储在 std::tm 对象(由 t 指向)中的日历日期和时间转换为字符串。格式字符串与 std::strftime 中使用的相同,但每个格式说明符都是通过对 do_put() 的单独调用来处理的,可以通过扩展此语言环境面来定制该调用。

1) 遍历字符序列 [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'
2) 调用最派生类的 do_put 成员函数。
3) 根据由 '%'modifier(如果它不是 '\0')的值以及 format 的值连接而成的格式转换序列,将存储在 std::tm 对象(由 t 指向)中的日历日期和时间转换为字符串。该格式的解释方式与函数 std::strftime 相同,但那些被描述为语言环境相关的格式是由此语言环境定义的,并且可能支持其他格式说明符(fill 参数用于这些实现定义的格式说明符,以供使用)。该字符串被写入到输出迭代器 out

内容

[编辑] 参数

out - 输出迭代器,转换结果将被写入其中
str - 一个流对象,此函数使用它在需要时获取语言环境面,例如,std::ctype 用于缩窄字符
t - 指向 std::tm 对象的指针,从中获取日期/时间值
fmtbeg - 指向 char_type 字符序列的第一个字符的指针,该序列指定了 转换格式
fmtend - 指向 char_type 字符序列的最后一个字符之后的指针,该序列指定了 转换格式
fill - 填充字符(通常是空格)
format - 命名 转换说明符 的字符
modifier - 可能出现在 %转换说明符 之间的可选修饰符

[编辑] 格式字符串

格式字符串包含零个或多个转换说明符和普通字符(除了 %)。所有普通字符(包括终止空字符)都会在不进行修改的情况下复制到输出字符串。每个转换说明符都以 % 字符开头,可选地后跟 EO 修饰符(如果语言环境不支持,则忽略),最后是确定说明符行为的字符。以下格式说明符可用

转换
说明符
说明 使用字段
% 写入字面量 %。完整的转换说明符必须为 %%
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 中,一周从周一开始,并且一年的第一周必须满足以下要求:

  • 包含 1 月 4 日。
  • 包含一年的第一个星期四。
tm_yeartm_wdaytm_yday
g
(C++11)
写入ISO 8601 周为基准的年份的后两位数字,即包含指定周的年份(范围 [00,99])。

在 ISO 8601 中,一周从周一开始,并且一年的第一周必须满足以下要求:

  • 包含 1 月 4 日。
  • 包含一年的第一个星期四。
tm_yeartm_wdaytm_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_yeartm_wdaytm_yday
OU
(C++11)
使用备用数字系统写入一年中的星期(与 %U 相同),例如在 ja_JP 地区使用 五十二 而不是 52。 tm_yeartm_wdaytm_yday
W 一年中的星期写入为十进制数(星期一是 一周的第一天)(范围 [00,53])。 tm_yeartm_wdaytm_yday
OW
(C++11)
使用备用数字系统写入一年中的星期(与 %W 相同),例如在 ja_JP 地区使用 五十二 而不是 52。 tm_yeartm_wdaytm_yday
V
(C++11)
写入ISO 8601 一年中的星期(范围 [01,53])。

在 ISO 8601 中,一周从周一开始,并且一年的第一周必须满足以下要求:

  • 包含 1 月 4 日。
  • 包含一年的第一个星期四。
tm_yeartm_wdaytm_yday
OV
(C++11)
使用备用数字系统写入一年中的星期(与 %V 相同),例如在 ja_JP 地区使用 五十二 而不是 52。 tm_yeartm_wdaytm_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_montm_mdaytm_year
F
(C++11)
等效于 "%Y-%m-%d"(ISO 8601 日期格式)。 tm_montm_mdaytm_year
r
(C++11)
写入本地化的12 小时制时间(与区域设置相关)。 tm_hourtm_mintm_sec
R
(C++11)
等效于 "%H:%M" tm_hourtm_min
T
(C++11)
等效于 "%H:%M:%S"(ISO 8601 时间格式)。 tm_hourtm_mintm_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)
根据指定的格式格式化并输出日期/时间值。
(函数模板) [edit]
[virtual] (C++11)
根据指定的格式从输入流中提取日期/时间组件。
(std::time_get<CharT,InputIt> 的虚拟受保护成员函数) [edit]