std::chrono::from_stream 正确用法

std::chrono::from_stream correct usage

我正在考虑使用 const std::string& 中的函数 std::chrono::from_stream (std::chrono::year_month_day) to get 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)

和return不知为何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';
}

(遗憾的是我们不能 demo this yet, as libstd++ doesn't implement P0355, and libc++'s nascent support is insufficient。)

注意这个提供了year/month/day,所以时间要舍弃

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

首先,from_stream 适用于流,而不适用于字符串。如果你想使用字符串,你必须先通过一个流:

std::istringstream iss("2018-12-09T00:00:00");

现在您期望的函数实际上是 parse,而不是 from_stream。它像 get_time 等其他操纵器一样工作,并将其工作委托给 from_stream:

std::chrono::year_month_day date;
if (not (iss >> std::chrono::parse("%FT%T", date))) {
    // Handle error
}

这相当于from_stream(iss, "%FT%T", date)

你可以在Howard's CppCon talk on time zones中看到解析的一些用法。他继续展示使用额外参数来确定实际解析了哪个时区缩写和偏移量的示例,但这与您问题中的用例无关。 (Howard 是它所基于的库的作者,也是推动其标准化的人。)