C++:
Анализ даты из строки
Как:
Используйте <chrono> и <sstream>, чтобы разобрать дату в C++. Вот быстрый пример:
#include <iostream>
#include <sstream>
#include <chrono>
#include <iomanip>
int main() {
std::string date_text = "2023-04-01";
std::istringstream ss(date_text);
std::chrono::year_month_day parsed_date;
ss >> std::chrono::parse("%F", parsed_date);
if (ss.fail()) {
std::cout << "Ошибка разбора\n";
return 1;
}
std::cout << "Год: " << int(parsed_date.year()) << '\n';
std::cout << "Месяц: " << unsigned(parsed_date.month()) << '\n';
std::cout << "День: " << unsigned(parsed_date.day()) << '\n';
return 0;
}Пример вывода:
Год: 2023
Месяц: 4
День: 1Подробнее
Разбор дат из строк не новость. Еще в дни C был типичен strptime. В современном C++, <chrono> - ваш друг. Он аккуратно разделяет заботы: форматирование/разбор с std::chrono::parse, и манипуляции с датами с помощью типов std::chrono.
До C++20 вы, скорее всего, использовали бы std::get_time или сторонние библиотеки, например, Boost. После C++20 стандартная библиотека получила обновление с улучшениями std::chrono. Теперь у вас есть типобезопасные типы дат и функции “из коробки”.
Функция разбора, std::chrono::parse, универсальна, понимает много форматов даты и времени. Формат “%F”, который мы использовали выше, - это формат даты ISO 8601 (год-месяц-день). Но вы также можете обрабатывать и другие, просто настроив строку формата соответственно.
Помните, несмотря на надежный разбор, пользовательский ввод сложен. Всегда корректно обрабатывайте ошибки разбора, как это сделано с ss.fail() в примере.
См. также
Углубитесь в <chrono> с официальной страницей cppreference.
Получите исторический контекст из мнения Страуструпа о истории C++ в Design and Evolution of C++.
Для крайних случаев или нестандартных форматов рассмотрите Boost.DateTime.