Проверьте правильность формата даты ISO 8601 - PullRequest
1 голос
/ 24 июня 2019

Как проверить, соответствует ли строка даты формату ISO 8601 (например, 2018-12-25T12:00:00+04:00) в C ++? Попытка использования strptime, чтобы проверить, является ли строка даты допустимым форматом ISO 8601, но не дает мне правильный результат.

1 Ответ

0 голосов
/ 24 июня 2019

Самый простой способ, о котором я знаю, это использовать бесплатную дату с открытым исходным кодом Говарда Хиннанта 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

Это не позволяет делать лишние секунды, но если вы захотите установить мою библиотеку поддержки часовых поясов по той же ссылке, это тоже можно сделать.Он проверяет на наличие неверного синтаксиса и недействительных дат и времени.

...