2017-10-07 109 views
0

我想通过创建一个流来验证一个线上的日期格式,例如这个(01 10 2017)。在C++中验证日期格式

 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;} 
     } 

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

谢谢

+0

恐怕你颠倒了流插入运算符'<<'。 – iBug

+0

AFAIK'std :: ostream'没有'operator >>()'。 – iBug

+0

可能值得看[std :: get_time](http://en.cppreference.com/w/cpp/io/manip/get_time)。 – Galik

回答

2

希望这会有所帮助。

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; 
    } 
2

我该怎么做才能改善验证?

使用经过良好测试的日期/时间库,如Howard Hinnant's free, open source, header-only date/time library

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;} 

将过早返回true表示“31 09 2017”。在9月只有30天