【问题标题】:Test if string represents "yyyy-mm-dd"测试字符串是否代表“yyyy-mm-dd”
【发布时间】:2015-09-08 04:39:13
【问题描述】:

我正在开发一个带有两个命令行参数的程序。两个参数都应该是 yyyy-mm-dd 形式的日期。由于其他人将使用该程序并且它将从 mysql 请求,因此我想确保命令行参数有效。我最初的想法是遍历传入字符串的每个元素并对其执行某种测试。 '-' 很容易检查,但我不太确定如何处理数字,以及如何区分整数和字符。另外,我需要第一个日期“小于或等于”第二个日期,但我很确定我可以处理。

【问题讨论】:

  • 尝试使用 std::stringstream
  • 如果您使用 C++11,则有 regex 库:\d{4}\-\d{2}\-d{2} 将测试格式化。要验证它是有效日期而不是 9999-99-992015-02-29,您需要使用某种日期库。
  • 使用标准库中的正则表达式。关于“我需要第一个日期“小于或等于”第二个日期,但我很确定我可以处理。”...您可能想要分析来自StackOverflow 上的顶级人物:stackoverflow.com/questions/6841333/… 正确比较日期并非易事。
  • 正则表达式不仅仅是 C++11 的特性。它可用于多种语言和所有版本的 C 和 C++ 作为附加库。
  • 你试过蛮力技术吗?请使用您尝试过的代码更新您的问题。

标签: c++ command-line-arguments


【解决方案1】:

如果你可以使用 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;
}

来源:http://www.cplusplus.com/forum/general/3094/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-19
    • 2019-01-26
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    相关资源
    最近更新 更多