C++ iomanip 库 - put_time 函数
描述
该函数通过首先构造一个 basic_ostream::sentry 类型的对象来访问输出序列。 然后(如果评估哨兵对象为真),它调用 time_put::put(使用流的选定语言环境)执行格式化和插入操作,相应地调整流的内部状态标志。 最后,它在返回之前销毁哨兵对象。
它用于插入 tmb 指向的时间和日期信息的表示形式,并按照参数 fmt 指定的格式对其进行格式化。
声明
以下是 std::put_time 函数的声明。
template <class charT> /*unspecified*/ put_time (const struct tm* tmb, const charT* fmt);
参数
tmb − 指向带有要格式化的日期和时间信息的 struct tm 类型对象的指针。 struct tm 是标题 <ctime> 中定义的类。
fmt − time_put::put 使用的 C 字符串作为格式字符串。 它包含常规字符和特殊格式说明符的任意组合。 这些格式说明符被函数替换为相应的值,以表示在 tmb 中指定的时间。
它们都以百分比 (%) 符号开头,如下所示 −
说明符 | 替换为 | 示例 |
---|---|---|
%a |
Abbreviated weekday name * | Thu |
%A |
Full weekday name * | Thursday |
%b |
Abbreviated month name * | Aug |
%B |
Full month name * | August |
%c |
Date and time representation * | Thu Aug 23 14:55:02 2001 |
%C |
Year divided by 100 and truncated to integer (00-99 ) |
20 |
%d |
Day of the month, zero-padded (01-31 ) |
23 |
%D |
Short MM/DD/YY date, equivalent to %m/%d/%y |
08/23/01 |
%e |
Day of the month, space-padded ( 1-31 ) |
23 |
%F |
Short YYYY-MM-DD date, equivalent to %Y-%m-%d |
2001-08-23 |
%g |
Week-based year, last two digits (00-99 ) |
01 |
%G |
Week-based year | 2001 |
%h |
Abbreviated month name * (same as %b ) |
Aug |
%H |
Hour in 24h format (00-23 ) |
14 |
%I |
Hour in 12h format (01-12 ) |
02 |
%j |
Day of the year (001-366 ) |
235 |
%m |
Month as a decimal number (01-12 ) |
08 |
%M |
Minute (00-59 ) |
55 |
%n |
New-line character ('\n' ) |
|
%p |
AM or PM designation | PM |
%r |
12-hour clock time * | 02:55:02 pm |
%R |
24-hour HH:MM time, equivalent to %H:%M |
14:55 |
%S |
Second (00-61 ) |
02 |
%t |
Horizontal-tab character ('\t' ) |
|
%T |
ISO 8601 time format (HH:MM:SS ), equivalent to %H:%M:%S |
14:55:02 |
%u |
ISO 8601 weekday as number with Monday as 1 (1-7 ) |
4 |
%U |
Week number with the first Sunday as the first day of week one (00-53 ) |
33 |
%V |
ISO 8601 week number (00-53 ) |
34 |
%w |
Weekday as a decimal number with Sunday as 0 (0-6 ) |
4 |
%W |
Week number with the first Monday as the first day of week one (00-53 ) |
34 |
%x |
Date representation * | 08/23/01 |
%X |
Time representation * | 14:55:02 |
%y |
Year, last two digits (00-99 ) |
01 |
%Y |
Year | 2001 |
%z |
ISO 8601 offset from UTC in timezone (1 minute=1, 1 hour=100) If timezone cannot be termined, no characters |
+100 |
%Z |
Timezone name or abbreviation * If timezone cannot be termined, no characters |
CDT |
%% |
A % sign |
% |
返回值
未指定。 此函数只能用作流操纵器。
通过修改流的内部状态标志来发出错误信号 −
标志 | 错误 |
---|---|
eofbit | - |
failbit | 该函数未能按照 fmt 指定的格式格式化 tmb(如果 sentry 的构造失败,也可以设置它)。 |
badbit | 流上的插入失败,或者发生了其他错误(例如当此函数捕获由内部操作引发的异常时)。 设置后,流的完整性可能会受到影响。 |
异常
Basic guarantee − 如果抛出异常,则对象处于有效状态。
如果生成的错误状态标志不是 goodbit 并且成员异常设置为针对该状态抛出,它会抛出成员类型失败的异常。
内部操作抛出的任何异常都会被函数捕获并处理,设置 badbit。 如果在最后一次调用异常时设置了 badbit,该函数将重新抛出捕获的异常。
数据竞争
访问 tmb 指向的对象和 fmt 指向的数组。
修改插入它的流对象。
对同一个流对象的并发访问可能会导致数据争用,但标准流对象(cout、cerr、clog、wcout、wcerr 和 wclog)与 stdio 同步时除外(在这种情况下,不会启动数据竞争,尽管不保证插入来自多个线程的字符的顺序)。
示例
在下面的示例中解释了 put_time 函数。
#include <iostream> #include <iomanip> #include <ctime> #include <chrono> 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; }