Pře*_*tný 1 c++ std c++-chrono c++20
我正在考虑使用函数从like std::chrono::from_stream (std::chrono::year_month_day)获取std::chrono::year_month_day对象。const std::string&2018-12-09T00:00:00
在cppreference中没有用法的示例std::chrono::from_stream。所以我想,它可以像一样使用std::get_time。
但是有一个问题!std::chrono::year_month_day有非常奇怪的参数(个人意见)
(std::basic_istream<CharT, Traits>& is, const CharT* fmt, std::chrono::year_month_day& ymd, std::basic_string<CharT, Traits, Alloc>* abbrev = nullptr, std::chrono::minutes* offset = nullptr)
Run Code Online (Sandbox Code Playgroud)
然后出于未知原因返回std::basic_istream,因此我意识到我真的不知道如何正确使用它。
有谁知道吗?谢谢。
这并不奇怪。
const std::string in = "2018-12-09T00:00:00";
std::stringstream ss(in);
std::chrono::year_month_day ymd;
if (std::chrono::from_stream(ss, "%FT%T", ymd))
{
std::cout << "Date: " << ymd << '\n';
}
Run Code Online (Sandbox Code Playgroud)
(遗憾的是我们还不能演示这个,因为 libstd++没有实现 P0355,而且libc++ 的新生支持是不够的。)
注意这里只提供年/月/日,所以时间必须舍弃。
您可能希望考虑其他一些from_stream重载(比如这个重载)。
首先,from_stream在流而不是字符串上工作。如果要使用字符串,则必须先通过流:
std::istringstream iss("2018-12-09T00:00:00");
Run Code Online (Sandbox Code Playgroud)
现在,您期望的功能实际上是解析的,不是from_stream。它的工作方式与其他操纵器(例如get_time,)类似,并将其工作委托给from_stream:
std::chrono::year_month_day date;
if (not (iss >> std::chrono::parse("%FT%T", date))) {
// Handle error
}
Run Code Online (Sandbox Code Playgroud)
这等效于from_stream(iss, "%FT%T", date)。
您可以在Howard的CppCon时区讨论中看到一些解析的用法。他继续展示了使用额外参数来确定实际解析了哪个时区缩写和偏移量的示例,但这与您问题中的用例无关。(霍华德是该图书馆所基于的图书馆的作者,以及推动其标准化的人。)