правильное использование std :: chrono :: from_stream - PullRequest
1 голос
/ 23 мая 2019

Я думаю об использовании функции 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)

и возвращаюсь по неизвестной причине std::basic_istream, поэтому я понял, что действительно не знаю, как правильно его использовать.

Кто-нибудь знает, пожалуйста? Спасибо.

Ответы [ 2 ]

5 голосов
/ 23 мая 2019

Во-первых, from_stream работает с потоками, а не со строками. Если вы хотите использовать строку, вы должны сначала пройти через поток:

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
}

Это эквивалентно from_stream(iss, "%FT%T", date).

Вы можете увидеть некоторое использование синтаксического анализа в Говард CppCon Говарда о часовых поясах . Далее он показывает примеры, которые используют дополнительные параметры, чтобы определить, какие аббревиатура и смещение часового пояса были фактически проанализированы, но это не относится к варианту использования в вашем вопросе. (Говард является автором библиотеки, на которой это основано, а также человеком, который настаивал на ее стандартизации.)

4 голосов
/ 23 мая 2019

Это не так странно.

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';
}

(К сожалению, мы пока не можем демо , поскольку libstd ++ не реализует P0355, и возникающая поддержка libc ++ недостаточна .)

Обратите внимание, что только предоставляет год / месяц / день, поэтому время должно быть

Вы можете рассмотреть некоторые другие from_stream перегрузки (например, эта ).

...