检查 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,它也可以做到这一点。它会检查无效语法和无效日期和时间。
如何在 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,它也可以做到这一点。它会检查无效语法和无效日期和时间。