函数
<iomanip>

std::put_time

template <class charT>/*unspecified*/ put_time (const struct tm* tmb, const charT* fmt);
输出日期和时间
插入由 tmb 指向的对象所表示的日期和时间信息,并根据参数 fmt 指定的格式进行格式化。

在内部,该函数首先构造一个 basic_ostream::sentry 类型的对象来访问输出序列。然后(如果 sentry 对象的评估为 true),它会调用 time_put::put(使用流的选定区域设置)来执行格式化和插入操作,并相应地调整流的内部状态标志。最后,在返回之前销毁 sentry 对象。

此操纵符在头文件 <iomanip> 中声明。

参数

tmb
指向类型为 struct tm 的对象,其中包含要格式化的日期和时间信息。
struct tm 是在头文件 <ctime> 中定义的类。
fmt
time_put::put 用作格式字符串的 C 字符串。它包含任意组合的普通字符和特殊格式说明符。这些格式说明符将被函数替换为相应的值,以表示 tmb 中指定的日期和时间。它们都以百分号 (%) 开始,并且是:
说明符替换为示例
%a缩写的星期名称*Thu
%A完整的星期名称*Thursday
%b缩写的月份名称*Aug
%B完整的月份名称*August
%c日期和时间表示*Thu Aug 23 14:55:02 2001
%C年份除以 100 并截断为整数 (00-99)20
%d月份中的日期,零填充 (01-31)23
%D简短的 MM/DD/YY 日期,等同于 %m/%d/%y08/23/01
%e月份中的日期,空格填充 ( 1-31)23
%F简短的 YYYY-MM-DD 日期,等同于 %Y-%m-%d2001-08-23
%g基于周的年份,最后两位数字 (00-99)01
%G基于周的年份2001
%h缩写的月份名称* (与 %b 相同)Aug
%H24 小时制的小时 (00-23)14
%I12 小时制的小时 (01-12)02
%j一年中的第几天 (001-366)235
%m月份的十进制数 (01-12)08
%M分钟 (00-59)55
%n换行符 ('\n')
%pAM 或 PM 标识PM
%r12 小时制时钟时间*02:55:02 pm
%R24 小时制 HH:MM 时间,等同于 %H:%M14:55
%S秒 (00-61)02
%t水平制表符 ('\t')
%TISO 8601 时间格式 (HH:MM:SS),等同于 %H:%M:%S14:55:02
%uISO 8601 星期几,星期一为 1 (1-7)4
%U周数,第一个星期日为第一周的第一天 (00-53)33
%VISO 8601 周数 (00-53)34
%w星期几的十进制数,星期日为 0 (0-6)4
%W周数,第一个星期一为第一周的第一天 (00-53)34
%x日期表示*08/23/01
%X时间表示*14:55:02
%y年份,最后两位数字 (00-99)01
%Y年份2001
%zISO 8601 时区与 UTC 的偏移量(1 分钟=1,1 小时=100)
如果无法确定时区,则不输出任何字符
+100
%Z时区名称或缩写*
如果无法确定时区,则不输出任何字符
CDT
%%一个 % 符号%
* 标有星号 (*) 的说明符依赖于区域设置。
还可以将两个特定于区域设置的修饰符插入百分号 (%) 和说明符本身之间,以便在适用时请求替代格式
修饰符含义适用于
E使用区域设置的替代表示%Ec %EC %Ex %EX %Ey %EY
O使用区域设置的替代数字符号%Od %Oe %OH %OI %Om %OM %OS %Ou %OU %OV %Ow %OW %Oy
charT 是 C 字符串中的字符类型。

返回值

未指定。此函数只应作为流操纵符使用(见示例)。

错误通过修改流的内部状态标志来指示。
flagerror
eofbit-
failbit该函数未能按 fmt 指定的方式格式化 tmb(如果 sentry 的构造失败,也可能设置此标志)。
badbit要么插入到流的操作失败,要么发生了其他错误(例如,当此函数捕获由内部操作抛出的异常时)。
设置此标志后,流的完整性可能受到影响。
一次操作可能设置多个标志。

如果该操作在流上设置了一个使用其成员 exceptions 注册的内部状态标志,则该函数将抛出类型为 ios_base::failure 的异常。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// put_time example
#include <iostream>     // std::cout
#include <iomanip>      // std::put_time
#include <ctime>        // std::time_t, struct std::tm, std::localtime
#include <chrono>       // std::chrono::system_clock

int main ()
{
  using std::chrono::system_clock;
  std::time_t tt = system_clock::to_time_t (system_clock::now());

  struct std::tm * ptm = std::localtime(&tt);
  std::cout << "Now (local time): " << std::put_time(ptm,"%c") << '\n';

  return 0;
}


可能的输出
Now (local time): 03/07/13 11:41:34


数据竞争

访问由 tmb 指向的对象和由 fmt 指向的数组。
修改插入到的流对象。
同时访问相同的流对象可能会导致数据竞争,除非是标准流对象(coutcerrclogwcoutwcerrwclog),并且当这些对象与 stdio同步时(在这种情况下,不会引发数据竞争,尽管不保证来自多个线程的字符插入顺序)。

异常安全

基本保证:如果抛出异常,对象处于有效状态。
如果最终的错误状态标志不是 goodbit 并且成员 exceptions 被设置为抛出异常,则抛出类型为 failure 的异常。
由内部操作抛出的任何异常都将被该函数捕获并处理,并设置 badbit。如果上一次调用 exceptions 时设置了 badbit,则该函数将重新抛出捕获到的异常。

请注意,无效参数会导致未定义行为

另见