Самый простой способ, о котором я знаю, это использовать бесплатную дату с открытым исходным кодом Говарда Хиннанта lib :
#include "date/date.h"
#include <iostream>
#include <sstream>
bool
is_valid(const std::string& s)
{
using namespace std;
using namespace date;
istringstream in{s};
local_seconds tp;
in >> parse("%FT%T%Ez", tp);
return !in.fail();
}
void
test(const std::string& s)
{
std::cout << s << " is" << (is_valid(s) ? "" : " not") << " valid\n";
}
int
main()
{
test("2018-12-25T12:00:00+04:00");
test("2019-06-24T09:00:00+04:00");
test("2018-2-30T12:00:00:00+04:00");
test("2018-2-20T25:00:00+04:00");
test("2016-12-31T23:59:60+04:00");
}
Вывод:
2018-12-25T12:00:00+04:00 is valid
2019-06-24T09:00:00+04:00 is valid
2018-2-30T12:00:00:00+04:00 is not valid
2018-2-20T25:00:00+04:00 is not valid
2016-12-31T23:59:60+04:00 is not valid
Это не позволяет делать лишние секунды, но если вы захотите установить мою библиотеку поддержки часовых поясов по той же ссылке, это тоже можно сделать.Он проверяет на наличие неверного синтаксиса и недействительных дат и времени.