测试字符串是否代表 "yyyy-mm-dd"
Test if string represents "yyyy-mm-dd"
我正在开发一个带有两个命令行参数的程序。两个参数都应该是 yyyy-mm-dd 形式的日期。由于其他人将使用此程序并且它会从 mysql 请求,我想确保命令行参数有效。我最初的想法是遍历传入字符串的每个元素并对它执行某种测试。 '-' 很容易检查,但我不太确定如何处理数字,以及如何区分整数和字符。另外,我需要第一个约会是 "less than or equal to" 第二个,但我很确定我可以处理。
如果你可以使用 boost 库,你可以简单地这样做:
string date("2015-11-12");
string format("%Y-%m-%d");
date parsedDate = parser.parse_date(date, format, svp);
您可以阅读更多相关信息 here。
如果你想要一个纯 C++ 解决方案,你可以尝试使用
struct tm tm;
std::string s("2015-11-123");
if (strptime(s.c_str(), "%Y-%m-%d", &tm))
std::cout << "Validate date" << std::endl;
else
std::cout << "Invalid date" << std::endl;
此外,您可以做一个简单的检查,看看日期是否有效,例如 2351-20-35。一个简单的解决方案是:
bool isleapyear(unsigned short year){
return (!(year%4) && (year%100) || !(year%400));
}
//1 valid, 0 invalid
bool valid_date(unsigned short year,unsigned short month,unsigned short day){
unsigned short monthlen[]={31,28,31,30,31,30,31,31,30,31,30,31};
if (!year || !month || !day || month>12)
return 0;
if (isleapyear(year) && month==2)
monthlen[1]++;
if (day>monthlen[month-1])
return 0;
return 1;
}
我正在开发一个带有两个命令行参数的程序。两个参数都应该是 yyyy-mm-dd 形式的日期。由于其他人将使用此程序并且它会从 mysql 请求,我想确保命令行参数有效。我最初的想法是遍历传入字符串的每个元素并对它执行某种测试。 '-' 很容易检查,但我不太确定如何处理数字,以及如何区分整数和字符。另外,我需要第一个约会是 "less than or equal to" 第二个,但我很确定我可以处理。
如果你可以使用 boost 库,你可以简单地这样做:
string date("2015-11-12");
string format("%Y-%m-%d");
date parsedDate = parser.parse_date(date, format, svp);
您可以阅读更多相关信息 here。
如果你想要一个纯 C++ 解决方案,你可以尝试使用
struct tm tm;
std::string s("2015-11-123");
if (strptime(s.c_str(), "%Y-%m-%d", &tm))
std::cout << "Validate date" << std::endl;
else
std::cout << "Invalid date" << std::endl;
此外,您可以做一个简单的检查,看看日期是否有效,例如 2351-20-35。一个简单的解决方案是:
bool isleapyear(unsigned short year){
return (!(year%4) && (year%100) || !(year%400));
}
//1 valid, 0 invalid
bool valid_date(unsigned short year,unsigned short month,unsigned short day){
unsigned short monthlen[]={31,28,31,30,31,30,31,31,30,31,30,31};
if (!year || !month || !day || month>12)
return 0;
if (isleapyear(year) && month==2)
monthlen[1]++;
if (day>monthlen[month-1])
return 0;
return 1;
}