在 c++ 中验证日期格式

Validating a date format in c++

本文关键字:日期 格式 验证 c++      更新时间:2023-10-16

我正在尝试通过创建流来验证诸如此行(01 10 2017)的日期格式。

        if(i%5==4){ //DATE
            std::string date;
            int day;
            int month;
            int year;
            std::ostringstream oss(date);
            oss >> day;
            oss >> month;
            oss >> year;
            if (day >=0 && day <= 31){
                return true;}
            if (month >=01 && month <= 12){
                return true;}
            if (year >=1900){
                return true;}
        }

但是,代码无法编译。我能做些什么来改进验证?

谢谢

我能做些什么来改进验证?

使用经过良好测试的日期/时间库,例如 Howard Hinnant 的免费、开源、仅标头日期/时间库。

bool
is_DMY(const std::string& date)
{
    std::istringstream in{date};
    date::year_month_day ymd;
    in >> date::parse("%d %m %Y", ymd);
    return !in.fail();
}

使用示例:

int
main()
{
    std::cout << is_DMY("30 09 2017") << 'n';
    std::cout << is_DMY("31 09 2017") << 'n';
}

其中输出:

1
0

这表明 OP 中的第一个测试:

       if (day >=0 && day <= 31){
            return true;}

将过早返回"31 09 2017"的true。 9月只有30天。

希望这有帮助。

    if(i%5==4){ //DATE
        std::string date;
        int day;
        int month;
        int year;
        std::ostringstream oss(date);
        oss << day;
        oss << month;
        oss << year;
        const int lookup_table[12] = {31,29,31,30,31,30,31,31,30,31,30,31};
        if (!(month >= 1 && month <= 12)){
            return false;}
        if (!(day >= 1 && day <= lookup_table[month-1])){
            return false;}
        if (!(year >= 1900)){
            return false;}
        return true;
    }