std::get_time
来自cppreference.com
在标头 <iomanip> 定义
|
||
template< class CharT > /*未指定*/ get_time( std::tm* tmb, const CharT* fmt ); |
(C++11 起) | |
用于表达式 in >> get_time(tmb, fmt) 时,按照格式字符串 fmt 及输入流 in 中当前浸染的本地环境的 std::time_get 平面,分析字符输入为日期/时间值。将结果存储到 tmb
指向的 std::tm 对象中。
参数
tmb | - | 指向 std::tm 对象的合法指针,将结果存储到它指向的对象中 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
fmt | - | 指向指定转换格式的空终止 CharT 字符串的指针
格式字符串由零或更多转换说明符、空白符和通常字符(除了
注意:不写入
|
返回值
一个满足以下条件但未指定类型的对象:
- 如果 in 是具有 std::basic_istream<CharT, Traits> 类型的对象,那么表达式 in >> get_time(tmb, fmt):
- 具有 std::basic_istream<CharT, Traits>& 类型
- 值为 in
- 行为如同调用 f(in, tmb, fmt)
其中函数 f 定义如下:
template<class CharT, class Traits> void f(std::basic_ios<CharT, Traits>& str, std::tm* tmb, const CharT* fmt) { using Iter = std::istreambuf_iterator<CharT, Traits>; using TimeGet = time_get<CharT, Iter>; std::ios_base::iostate err = std::ios_base::goodbit; const TimeGet& tg = std::use_facet<TimeGet>(str.getloc()); tg.get(Iter(str.rdbuf()), Iter(), str, err, tmb, fmt, fmt + Traits::length(fmt)); if (err != std::ios_base::goodbit) str.setstate(err); }
注意
如 std::time_get::do_get 中所指定,未指明此函数是否清零在 fmt 中出现的格式指定符所不直接选择的 *tmb 中的域:可移植程序在调用 std::get_time
前应该初始化 *tmb 的每个域。
示例
注意:选择 clang 或 12.1 及以上版本的 gcc 以观察输出。12.1 版本以前的 libstdc++ 未正确实现 %b 指定符:漏洞 #78714
运行此代码
#include <iostream> #include <sstream> #include <locale> #include <iomanip> int main() { std::tm t = {}; std::istringstream ss("2011-Februar-18 23:12:34"); ss.imbue(std::locale("de_DE.utf-8")); ss >> std::get_time(&t, "%Y-%b-%d %H:%M:%S"); if (ss.fail()) std::cout << "解析失败\n"; else std::cout << std::put_time(&t, "%c") << '\n'; }
可能的输出:
Sun Feb 18 23:12:34 2011
参阅
从输入字符序列中解析时间/日期值到 std::tm 中 (类模板) | |
(C++11) |
按照指定格式格式化并输出日期/时间值 (函数模板) |