C# 我有以下字符串;12-5“;而我';我试图在.NET中使用TryParse解析它。它返回true,如何为给定字符串设置false?

C# 我有以下字符串;12-5“;而我';我试图在.NET中使用TryParse解析它。它返回true,如何为给定字符串设置false?,c#,.net,validation,datetime-format,tryparse,C#,.net,Validation,Datetime Format,Tryparse,当将“12-5”或“12,5”作为.NET中DateTime.TryParse的输入时,它将其转换为“12-05-2020”,返回值为true。“12-5”如何等于“12-05-2020”?在我的例子中,输入字符串是用户的出生日期,根据要求是自由文本,解析值“12-05-2020”没有意义,因为出生日期不能是未来的日期。有没有一种方法可以在不使用DateTime.Parse或DateTime.ParseExact的情况下更正此问题,因为它们可能会引发异常 按照@Rafalon的建议,使用Date

当将“12-5”“12,5”作为.NET中DateTime.TryParse的输入时,它将其转换为“12-05-2020”,返回值为true。“12-5”如何等于“12-05-2020”?在我的例子中,输入字符串是用户的出生日期,根据要求是自由文本,解析值“12-05-2020”没有意义,因为出生日期不能是未来的日期。有没有一种方法可以在不使用DateTime.Parse或DateTime.ParseExact的情况下更正此问题,因为它们可能会引发异常

按照@Rafalon的建议,使用DateTime.TryParseExact避免异常,并设置所需的格式

string dateformat = "12-05";
bool answer = DateTime.TryParseExact(dateformat, "dd-MM-yyyy", CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out DateTime result);

嗯,您有两个测试要执行:

  • 对于有效的日期语法(例如,
    blablabla
    不是一个)
  • 获取有效的日期值(例如,
    25-03-2123
    不是一个)
  • 让我们在一个
    中检查这些要求,如果

       string userInput = "12-05-15"; // 12 May 2015
    
       ...
    
       // We can use several formats in one go:
       // DateTime.TryParseExact will try formats in the given order
       string[] allowedFormats = new string[] {
         "d-M-yy", "d-M-yyyy", "MMM d yyyy",
       };
    
       if (DateTime.TryParseExact(
              userInput.Trim(), // let's tolerate leading/trailing whitespaces
              allowedFormats,        
              CultureInfo.InvariantCulture, 
              System.Globalization.DateTimeStyles.None, 
              out var result) && 
           result <= DateTime.Today &&
           result >= DateTime.Today.AddYears(-150)) {
         // result is 
         //   1. Valid date 
         //   2. At least 150 years ago
         //   3. At most today 
       }
       else {
         // userInput doesn't meet at least one criterium
       } 
    
    string userInput=“12-05-15”;//2015年5月12日
    ...
    //我们可以一次性使用多种格式:
    //DateTime.TryParseExact将按给定顺序尝试各种格式
    字符串[]allowedFormats=新字符串[]{
    “d-M-yy”、“d-M-yyy”、“MMM-d-yyy”,
    };
    如果(DateTime.TryParseExact)(
    userInput.Trim(),//让我们容忍前导/尾随空格
    允许的格式,
    CultureInfo.InvariantCulture,
    System.Globalization.DateTimeStyles.None,
    输出风险值(var结果)和
    结果=DateTime.Today.AddYears(-150)){
    //结果是
    //1.有效日期
    //2.至少150年前
    //3.今天最多
    }
    否则{
    //userInput至少不符合一个标准
    } 
    
    “没有意义,因为出生日期不能是未来的日期”-这不是你可以告诉TryParse的事情,我不认为:你必须在解析后验证你给出的日期。也许使用?然后将日期验证为Rup saidEven如果您使用纯文本字段作为输入,您仍然应该对您期望的格式有很好的理解(并将此信息提供给用户)。否则,您将得到例如欧洲和美国日期格式wrt月和日的混合:1985年4月3日可能意味着3月4日和4月3日。一旦你对你想要的格式有了一个想法,就用一个合适的解析器把它解析掉。@Rafalon,谢谢你的回复。请看,主要问题是我无法为验证指定任何固定格式。在我们的例子中,我们使用扫描的表单并从中获取书面值。因此,这限制了我使用tryparseexact,而您只需
    TryParse
    ,并希望它能够正确解析任何格式(请参见上面Sergey关于两个日期对应的相同书写日期的评论,具体取决于格式)。然后,如果解析成功,您可以在DmitryIn的第二个点中验证日期,而不是使用
    null
    最好使用
    CultureInfo。InvariantCulture
    因为
    null
    表示当前区域性,它在不同的机器上会不同,因此可能导致不同的机器上出现不同的解析行为。@ckuri OK。谢谢。使用TryParseExact,我无法将字符串限制为某些特定格式。在我的例子中,字符串可以是任何格式,比如12-05-96、12-05-1996、12-05-1996以及用户过去给出的任何格式。我们正在处理历史数据,因此不能期望有固定的格式。Thanks@phanibnr:在这种情况下,您可以在单个
    TryParseExact
    调用中提供多种格式。我已经编辑了答案