首页 > 解决方案 > std::chrono::from_stream 正确用法

问题描述

我正在考虑使用函数从likestd::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)

并以未知原因返回std::basic_istream,所以我意识到我真的不知道如何正确使用它。

请问有人知道吗?谢谢。

标签: c++stdchronoc++20

解决方案


首先,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 的 CppCon talk on time zone中看到一些解析的用法。他继续展示使用额外参数来确定实际解析的时区缩写和偏移量的示例,但这与您问题中的用例无关。(霍华德是该库的作者,也是推动其标准化的人。)


推荐阅读