1

我有以下方法,就处理真正的无效/有效日期而言,它可以正常工作,但是,如果我遇到空字符串或带有掩码的日期,例如__/__/____,我想将它们作为有效传递,但DateTime.TryParse会使它们无效。如何修改以下方法以传递我的无效场景?下面的方法是一个示例程序:

public bool ValidateDate(string date, out string message)
{
    bool success = true;
    message = string.Empty;
    DateTime dateTime;

    if(DateTime.TryParse(date,out dateTime))
    {
        success = false;
        message = "Date is Invalid";
    }

    return success;
}

void Main()
{
    //The only date below that should return false is date4.

    string date = "01/01/2020";
    string date2 = "";
    string date3 = "__/__/____";
    string date4 = "44/__/2013";

    string message;

    ValidateDate(date, out message); //Should return true
    ValidateDate(date2, out message); //Should return true
    ValidateDate(date3, out message); //Should return true
    ValidateDate(date4, out message); //Should return false
}

我无法将其更改为,if(!DateTime.TryParse(date3,out dateTime))因为这将对我想要验证的日期返回 false。

我也试过做类似的事情if(!date3.contains("_") && DateTime.TryParse(date3,out dateTime)),但这仍然失败。我应该颠倒我的验证顺序吗?问题是我不只是在第一个无效日期返回 false,我正在构建StringBuilder所有无效日期然后返回它,所以我不认为:

if(DateTime.TryParse(date3,out dateTime))
        return true;
    else
        return true;

public bool ValidateDate(string date, out string message)
{
    string[] overrides = {"","__/__/____"};

    bool success = true;
    message = string.Empty;
    DateTime dateTime;

    if(!overrides.Contains(date) && !DateTime.TryParse(date,out dateTime))
    {
        success = false;
        message = "Date is Invalid";
    }


    return success;
}
4

2 回答 2

4

DateTime.TryParse在运行该方法之前,您可以只查看一组覆盖吗?

static string[] overrides = { "", "__/__/____" };
public bool ValidateDate(string date, out string message)
{
    bool success = true;
    message = string.Empty;

    if(overrides.Contains(date)) { return success; }

    DateTime dateTime;

    if(!DateTime.TryParse(date,out dateTime))
    {
        success = false;
        message = "Date is Invalid";
    }


    return success;
}
于 2013-06-20T01:11:39.553 回答
1

有很多方法可以给这只猫剥皮。我想这取决于您想将多少无效数据视为有效数据。另外,DateTime.TryParse会考虑当前的文化设置,所以也许你也应该考虑?

bool ValidateDate(string date, out string message)
{
    message = string.Empty;

    if (date == null)
        return true;

    const string mask = "_";
    var separator = CultureInfo.CurrentCulture.DateTimeFormat.DateSeparator;
    var test = date.Replace(mask, string.Empty).Replace(separator, string.Empty);
    if (string.IsNullOrWhiteSpace(test))
        return true;

    DateTime dateTime;
    if (!DateTime.TryParse(date, out dateTime))
    {
        message = "Date is Invalid";
        return false;
    }

    return true;
}

我想你也可以用正则表达式来做到这一点。有很多有效的解决方案。

于 2013-06-20T01:28:27.903 回答