检查 ISO 8601 日期格式是否有效

Check if ISO 8601 date format is valid

如何在 C++ 中检查日期字符串是否为 ISO 8601 格式(例如 2018-12-25T12:00:00+04:00)? 尝试使用 strptime 检查日期字符串是否为有效的 ISO 8601 格式,但没有给出正确的结果。

我知道的最简单的方法是使用 Howard Hinnant's free, open-source date 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

这不允许闰秒,但如果您愿意同时安装我的时区支持库 link,它也可以做到这一点。它会检查无效语法和无效日期和时间。