使用DateTime.TryParse检查字符串是否是有效日期

我正在使用DateTime.TryParse()函数来检查特定字符串是否是一个有效的日期时间,而不依赖于任何文化。
令我惊讶的是,对于“1-1”,“1/1”等字符串,函数返回true

我怎么解决这个问题?

更新:

这是否意味着,如果我想检查一个特定的字符串是否是有效的日期时间,我需要一个庞大的格式数组? 我相信会有不同的组合。
即使有很多日期分隔符(’。’,’/’,’ – ‘等等)取决于文化,我也很难定义要检查的格式数组。
基本上,我想检查特定字符串是否包含任何顺序的最少日(1到31或01到31),月(1到12或01到12)和年(yyyy或yy),以及任何日期分隔符,什么是解决方案?
因此,如果值包含时间的任何部分,它也应该返回true。 我无法定义格式数组。

如果您希望您的日期符合特定格式或格式,则使用DateTime.TryParseExact否则这是DateTime.TryParseExact的默认行为

DateTime.TryParse

如果可能,此方法会尝试忽略无法识别的数据 ,并使用当前日期填写缺少的月,日和年信息。 如果s仅包含日期而没有时间,则此方法假定时间是午夜12:00。 如果s包含具有两位数年份的日期组件,则会根据Calendar.TwoDigitYearMax属性的值将其转换为当前文化的当前日历中的年份。 s中的任何前导,内部或尾随空格字符都将被忽略。

如果要确认多种格式,请查看DateTime.TryParseExact方法(String,String [],IFormatProvider,DateTimeStyles,DateTime)重载。 来自同一链接的示例:

 string[] formats= {"M/d/yyyy h:mm:ss tt", "M/d/yyyy h:mm tt", "MM/dd/yyyy hh:mm:ss", "M/d/yyyy h:mm:ss", "M/d/yyyy hh:mm tt", "M/d/yyyy hh tt", "M/d/yyyy h:mm", "M/d/yyyy h:mm", "MM/dd/yyyy hh:mm", "M/dd/yyyy hh:mm"}; string[] dateStrings = {"5/1/2009 6:32 PM", "05/01/2009 6:32:05 PM", "5/1/2009 6:32:00", "05/01/2009 06:32", "05/01/2009 06:32:00 PM", "05/01/2009 06:32:00"}; DateTime dateValue; foreach (string dateString in dateStrings) { if (DateTime.TryParseExact(dateString, formats, new CultureInfo("en-US"), DateTimeStyles.None, out dateValue)) Console.WriteLine("Converted '{0}' to {1}.", dateString, dateValue); else Console.WriteLine("Unable to convert '{0}' to a date.", dateString); } // The example displays the following output: // Converted '5/1/2009 6:32 PM' to 5/1/2009 6:32:00 PM. // Converted '05/01/2009 6:32:05 PM' to 5/1/2009 6:32:05 PM. // Converted '5/1/2009 6:32:00' to 5/1/2009 6:32:00 AM. // Converted '05/01/2009 06:32' to 5/1/2009 6:32:00 AM. // Converted '05/01/2009 06:32:00 PM' to 5/1/2009 6:32:00 PM. // Converted '05/01/2009 06:32:00' to 5/1/2009 6:32:00 AM. 

如果要与特定日期格式匹配,请使用DateTime.TryParseExact()

  string format = "ddd dd MMM h:mm tt yyyy"; DateTime dateTime; if (DateTime.TryParseExact(dateString, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out dateTime)) { Console.WriteLine(dateTime); } else { Console.WriteLine("Not a date"); } 
 [TestCase("11/08/1995", Result= true)] [TestCase("1-1", Result = false)] [TestCase("1/1", Result = false)] public bool IsValidDateTimeTest(string dateTime) { string[] formats = { "MM/dd/yyyy" }; DateTime parsedDateTime; return DateTime.TryParseExact(dateTime, formats, new CultureInfo("en-US"), DateTimeStyles.None, out parsedDateTime); } 

只需在名为格式的数组中指定您希望接受的日期时间格式

我用以下代码解决了这个问题:

 protected bool CheckDate(String date) { try { DateTime dt = DateTime.Parse(date); return true; } catch { return false; } } 

基本上,我想检查特定字符串是否包含任何顺序的最少日(1到31或01到31),月(1到12或01到12)和年(yyyy或yy),以及任何日期分隔符,什么是解决方案? 因此,如果值包含时间的任何部分,它也应该返回true。 我无法定义格式数组。

当我处于类似的情况时,我就是这样做的:

  1. 收集我的系统预期支持的所有格式。
  2. 看看什么是常见或可以概括。
  3. 学会创建REGEX(这是最初的投资,但一旦你自己创建一两个就会得到回报)。 另外,不要尝试一次性为所有格式构建REGEX,遵循增量过程。
  4. 我创建了REGEX以涵盖尽可能多的格式。
  5. 对于少数情况,不要使REGEX更复杂,我通过DateTime.Parse()方法覆盖它。
  6. 通过Parse和REGEX的组合,我能够validation输入是否正确/如预期的那样。

这个http://www.codeproject.com/Articles/13255/Validation-with-Regular-Expressions-Made-Simple对于理解和validation每种格式的语法都非常有用。

我的2美分,如果它有帮助….

尝试使用

 DateTime.ParseExact( txtPaymentSummaryBeginDate.Text.Trim(), "MM/dd/yyyy", System.Globalization.CultureInfo.InvariantCulture ); 

如果输入字符串格式不正确,则抛出exception,因此在catch部分中可以return false;

所以这个问题已得到解答,但对我来说,使用的代码不够简单或完整。 对我来说,这里是我正在寻找的东西,也许其他人也会喜欢这个。

 if (DateTime.TryParse(DateString, out DateTime Temp) == true) { //do stuff }