std::get_time
来自cppreference.com
| 在标头 <iomanip> 定义
|
||
| |
(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 <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 << "解析失败\n";
else
std::cout << std::put_time(&t, "%c") << '\n';
}
可能的输出:
Sun Feb 18 23:12:34 2011
参阅
| 从输入字符序列中解析时间/日期值到 std::tm 中 (类模板) | |
(C++11) |
按照指定格式格式化并输出日期/时间值 (函数模板) |
(C++20) |
从流分析 chrono 对象 (函数模板) |