std :: chrono :: from_stream正确用法

时间:2019-05-23 13:15:09

标签: c++ std chrono c++20

我正在考虑使用函数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,所以我意识到我真的不知道如何正确使用它。

有人知道吗? 谢谢。

2 个答案:

答案 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 P0355libc++'s nascent support is insufficient。)

请注意,此仅提供年/月/日,因此必须丢弃时间。

您可能希望考虑其他一些from_stream重载(例如this one)。