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

Kai*_*Kai 32 .net c#

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

我怎么解决这个问题?

更新:

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

Hab*_*bib 46

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

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.
Run Code Online (Sandbox Code Playgroud)

  • @Kai,对于你的更新,它将很难*(我不是说不可能的YET)*,但你必须对你的字符串有一些规则,REGEX作为一种可能的解决方案,但我不认为即便如此使用所有类型的字符串. (2认同)

Mud*_*san 11

使用 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");
}
Run Code Online (Sandbox Code Playgroud)


Use*_*678 6

[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);
}
Run Code Online (Sandbox Code Playgroud)

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


Sey*_*aei 6

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

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


Dea*_*ker 6

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

string dateString = "198101";

if (DateTime.TryParse(dateString, out DateTime Temp) == true)
{
     //do stuff
}
Run Code Online (Sandbox Code Playgroud)

输出存储在要测试的输入字符串中Temp,以后不再需要。datestring