我正在考虑使用函数std::chrono::from_stream (std::chrono::year_month_day)
来从const std::string&
中获取std::chrono::year_month_day
对象,就像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)
并以未知原因退回std::basic_istream
,所以我意识到我真的不知道如何正确使用它。
有人知道吗? 谢谢。
答案 0 :(得分:5)
首先,.box-s{
position: absolute;
top: 10px;
right: 10px;
width: 300px;
height: 350px;
background: #fff;
color: #9e9e9e;
margin: 0 auto;
margin-bottom: 20px;
text-align: center;
line-height: 35px;
font-family: "Forte";
font-size: 20px;
}
适用于流,而不适用于字符串。如果要使用字符串,则必须先通过流:
from_stream
现在,您期望的功能实际上是parse,而不是std::istringstream iss("2018-12-09T00:00:00");
。它像from_stream
之类的其他操纵器一样工作,并将其工作委托给get_time
:
from_stream
这等效于std::chrono::year_month_day date;
if (not (iss >> std::chrono::parse("%FT%T", date))) {
// Handle error
}
。
您可以在Howard's CppCon talk on time zones中看到一些解析的用法。他继续展示了使用额外参数来确定实际解析了哪个时区缩写和偏移量的示例,但这与您问题中的用例无关。 (霍华德是该图书馆所基于的图书馆的作者,以及推动其标准化的人。)
答案 1 :(得分:4)
这不是很奇怪。
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';
}
(很遗憾,我们还不能demo,如libstd ++ doesn't implement P0355和libc++'s nascent support is insufficient。)
请注意,此仅仅提供年/月/日,因此必须丢弃时间。
您可能希望考虑其他一些from_stream
重载(例如this one)。