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.