Namespaces
Variants

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

From cppreference.net
std::time_put
Member functions
time_put::put time_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)

将指向 std::tm 对象的日历日期和时间,按照 格式字符串 [fmtbeg, fmtend) 转换为字符字符串。该格式字符串与 std:: strftime 所使用的格式相同,但每个格式说明符都通过单独调用 do_put() 进行处理,这一处理过程可通过扩展此 facet 进行自定义。

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) t 所指向的 std::tm 对象中存储的日历日期和时间转换为字符字符串,转换格式由连接 '%' 、若 modifier ' \0 ' 则连接其值、以及 format 的值所形成的格式转换序列决定。该格式的解释方式与函数 std::strftime 相同,不同之处在于:被描述为依赖于区域设置的格式由此区域设置定义,且可能支持额外的格式说明符( fill 参数供这些实现定义的格式说明符使用)。生成的字符串被写入输出迭代器 out

目录

参数

out - 转换结果写入的输出迭代器
str - 此函数在需要时用于获取本地化刻面的流对象,例如用于窄字符处理的 std::ctype
t - 指向 std::tm 对象的指针,从中获取日期/时间值
fmtbeg - 指向 char_type 字符序列起始的指针,该序列指定 转换格式
fmtend - 指向 char_type 字符序列末尾后一位置的指针,该序列指定 转换格式
fill - 填充字符(通常为空格)
format - 命名 转换说明符 的字符
modifier - 可选的修饰符,可能出现在 % 转换说明符 之间

格式字符串

格式字符串由零个或多个转换说明符和普通字符(除 % 外)组成。所有普通字符(包括终止空字符)会不经修改地复制到输出字符串中。每个转换说明以 % 字符开始,可选地后跟 E O 修饰符(若区域设置不支持则忽略),最后是决定说明符行为的字符。可用的格式说明符如下:

</tr
转换
说明符
说明 使用的字段
% 写入字面量 % 。完整转换规范必须为 %%
n
(C++11)
写入换行符
t
(C++11)
写入水平制表符
年份
Y 年份 写作十进制数字,例如 2017 tm_year
EY
(C++11)
以替代表示法写入 年份 ,例如在 ja_JP 区域设置中写作平成23年而非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 era) tm_year
G
(C++11)
写入 基于 ISO 8601 周的年份 ,即包含指定周的年份。

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

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

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

  • 包含1月4日
  • 包含该年的第一个星期四
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 中,周从周一开始,且一年的第一周必须满足以下要求:

  • 包含1月4日
  • 包含该年的第一个星期四
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年而非2011年 全部
x 写入本地化的 日期表示 (区域设置相关) 全部

返回值

指向已生成最后一个字符之后位置的迭代器。

注释

未提供错误处理。

fill 字符专为那些实现定义的格式说明符以及用户自定义的 do_put() 重载而提供,这些重载会使用填充逻辑。此类实现通常会利用 str 中的格式化标志。

示例

#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);
}

可能的输出:

使用格式字符串 '%c' 格式化时间:Mon Feb 11 22:58:50 2013
在区域设置 'de_DE.utf8' 中:'Mo 11 Feb 2013 23:02:38 EST'
在区域设置 'el_GR.utf8' 中:'Δευ 11 Φεβ 2013 11:02:38 μμ EST'
在区域设置 'ja_JP.utf8' 中:'2013年02月11日 23時02分38秒'

缺陷报告

以下行为变更缺陷报告被追溯应用于先前发布的C++标准。

缺陷报告 应用于 发布时的行为 正确行为
LWG 164 C++98 参数 fill 的用途不明确 已明确说明

参见

(C++11)
根据指定格式格式化并输出日期/时间值
(函数模板)
[virtual] (C++11)
根据指定格式从输入流提取日期/时间组件
( std::time_get<CharT,InputIt> 的虚保护成员函数)