std::get_time
来自 cppreference.cn
定义于头文件 <iomanip> |
||
template< class CharT > /*未指定*/ get_time( std::tm* tmb, const CharT* fmt ); |
(C++11 起) | |
当在表达式 in >> get_time(tmb, fmt) 中使用时,根据输入流 in 中当前注入的区域设置的 std::time_get 面,将字符输入解析为符合格式字符串 fmt 的日期/时间值。结果值存储在由 tmb 指向的 std::tm 对象中。
目录 |
[编辑] 参数
tmb | - | 指向 std::tm 对象的有效指针,结果将存储在此处 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
fmt | - | 指向 null 终止的 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 中指定,此函数是否将 *tmb 中未由 fmt 中出现的转换说明符直接设置的字段清零是未指定的:可移植程序应在调用 std::get_time
之前将 *tmb 的每个字段初始化为零。
[编辑] 示例
注意:选择 clang 或 gcc >= 12.1 以观察输出。12.1 之前的 libstdc++ 没有正确实现 %b 说明符:bug #78714。
运行此代码
#include <iomanip> #include <iostream> #include <locale> #include <sstream> 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 << "Parse failed\n"; else std::cout << std::put_time(&t, "%c") << '\n'; }
可能的输出
Sun Feb 18 23:12:34 2011
[编辑] 参阅
从输入字符序列解析时间/日期值到 std::tm (类模板) | |
(C++11) |
根据指定格式格式化并输出日期/时间值 (函数模板) |
(C++20) |
从流解析 chrono 对象(函数模板) |