C# 是否将无效日期处理为有效日期?

C# 是否将无效日期处理为有效日期?,c#,parsing,datetime,C#,Parsing,Datetime,我有下面的方法,它可以正确地处理一个真正的无效/有效日期,但是,如果我遇到一个空字符串或一个带有掩码的日期,例如_/__/___;,我希望将它们作为有效的传递,但是DateTime.TryParse会使它们无效。我如何修改下面的方法来传递我的无效场景?以下方法是一个示例程序: public bool ValidateDate(string date, out string message) { bool success = true; message = string.Empty

我有下面的方法,它可以正确地处理一个真正的无效/有效日期,但是,如果我遇到一个空字符串或一个带有掩码的日期,例如_/__/___;,我希望将它们作为有效的传递,但是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
}
我不能把它改成如果!TryParsedate3,out DateTime,因为对于我想要验证的日期,这将返回false

我也试着做一些类似“如果”!date3.contains&&DateTime.TryParsedate3,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;
}

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


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


有很多方法可以剥这只猫的皮。我想这取决于您希望将多少无效数据视为有效数据。此外,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;
}

我想你也可以用正则表达式来做。有很多有效的解决办法。

有很多方法可以剥这只猫的皮。我想这取决于您希望将多少无效数据视为有效数据。此外,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;
}

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

几乎可以肯定,您必须编写一个正则表达式来处理此问题。请看这里:@yack-我想到了正则表达式。你能提供一个答案吗?你几乎肯定要写一个正则表达式来处理这个问题。看看这里:@恶心-我想到了正则表达式。你能提供一个答案吗?我想你可能是对的。我什么都试过了,所以我要试一试。错过一个!第二if@MattJohnson-效果很好,我只是做了一点小小的修改,因为我处理其他验证,我不能只返回一个成功的日期,所以看看更新的方法,让我知道它是否看起来不错?所以。。。如果一个日期被成功解析,你想失败吗?是的,我只是从原始帖子复制粘贴了两行,我想你可能是对的。我什么都试过了,所以我要试一试。错过一个!第二if@MattJohnson-效果很好,我只是做了一点小小的修改,因为我处理其他验证,我不能只返回一个成功的日期,所以看看更新的方法,让我知道它是否看起来不错?所以。。。如果一个日期被成功解析,你想失败吗?是的,我刚从原始帖子中复制并粘贴了两行扫描,你能详细介绍一下文化吗?我的日期将以en-US文化存储,而不考虑文化?存储为DateTime,文化不重要。但作为弦,它们确实如此。您如何知道用户将输入mm/dd/yyyy或dd/mm/yyyy?你确定分隔符总是一个正斜杠,还是一个破折号或句号?如果今年是第一年呢?如果你想了解文化,那么你必须考虑这些事情。如果您要锁定特定的区域性,那么您可能应该使用TryParseExact并将格式和区域性传递进来。您能详细介绍一下区域性吗?我的日期将以en-US文化存储,而不考虑文化?存储为DateTime,文化不重要。但作为弦,它们确实如此。您如何知道用户将输入mm/dd/yyyy或dd/mm/yyyy?你确定分隔符总是一个正斜杠,还是一个破折号或句号?如果今年是第一年呢?如果你想了解文化,那么你必须考虑这些事情。如果要锁定特定的区域性,那么可能应该使用TryParseExact并将格式和区域性传递进来。